sql >> Database >  >> RDS >> Database

SQL DROP-KOLOM voor beginners

Als u in SQL een kolom uit een tabel wilt verwijderen, moet u de ALTER TABLE gebruiken statement met de DROP COLUMN clausule.

Dat verwijdert de kolom en al zijn gegevens.

Syntaxis

De syntaxis gaat als volgt:

ALTER TABLE table_name 
DROP COLUMN column_name;

Sommige RDBMS'en accepteren een optionele IF EXISTS argument, wat betekent dat er geen fout wordt geretourneerd als de kolom niet bestaat.

Sommige RDBMS'en accepteren ook optionele CASCADE en RESTRICT argumenten, die specificeren wat er moet gebeuren als de kolom afhankelijkheden heeft. Zie hieronder voor meer informatie hierover.

Voorbeeld

Hier is een voorbeeld om te demonstreren.

ALTER TABLE Products 
DROP COLUMN ProductDescription;

Dit verwijdert de ProductDescription kolom uit de Products tafel.

De IF EXISTS Argument

Afhankelijk van uw RDBMS kunt u mogelijk de IF EXISTS . gebruiken argument, dat de kolom voorwaardelijk alleen laat vallen als deze al bestaat.

Het voordeel hiervan is dat u geen foutmelding krijgt als de kolom niet bestaat.

Voorbeeld:

ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;

Beperk de wijziging

Afhankelijk van uw RDBMS kunt u mogelijk de CASCADE . gebruiken en RESTRICT argumenten om aan te geven wat er moet gebeuren als de kolom afhankelijkheden heeft, zoals externe sleutels of views.

RESTRICT is meestal het standaardgedrag, dus als u geen van deze argumenten opgeeft, zal het DBMS weigeren de kolom te verwijderen als er afhankelijke objecten zijn.

Voorbeeld:

ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;

Als u de bovenstaande instructie gebruikt en de kolom afhankelijkheden heeft, mislukt de drop-bewerking en krijgt u een foutmelding.

Dit is de foutmelding die ik krijg in PostgreSQL wanneer ik probeer een tabel te verwijderen waarnaar wordt verwezen door een weergave:

cannot drop column productdescription of table products because other objects depend on it

Cascade de verandering

De CASCADE gebruiken optie zorgt ervoor dat alle afhankelijke objecten worden verwijderd.

Dit is wat er gebeurt als ik het vorige voorbeeld verander in CASCADE :

ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;

Resultaat:

NOTICE: drop cascades to view vproducts
Commands completed successfully

In dit geval werd de kolom verwijderd en kreeg ik een bericht waarin werd uitgelegd dat de weergave met de naam vproducts werd ook verwijderd.

CASCADE en RESTRICT worden ondersteund in PostgreSQL, maar niet in SQL Server of MySQL. Beide trefwoorden kunnen in MariaDB worden gebruikt, maar hebben geen effect.

Oracle accepteert een CASCADE CONSTRAINTS clausule die alle externe-sleutelbeperkingen laat vallen die verwijzen naar de primaire en unieke sleutels die zijn gedefinieerd in de verwijderde kolommen, evenals alle beperkingen met meerdere kolommen die zijn gedefinieerd in de verwijderde kolommen.

Meerdere kolommen laten vallen

Bij sommige RDBM's kunt u meerdere kolommen in een enkele ALTER TABLE plaatsen uitspraak. De syntaxis varieert tussen RDBMS.

In SQL Server kunt u eenvoudig elke kolom weergeven, gescheiden door een komma:

ALTER TABLE t1 
DROP COLUMN c1, c2;

In andere RDBMS'en (zoals MySQL en PostgreSQL), zou u DROP COLUMN moeten herschrijven voor elke kolom:

ALTER TABLE t1 
DROP COLUMN c1, DROP COLUMN c2;

Merk op dat deze syntaxis een uitbreiding is op SQL en niet voldoet aan de SQL-standaard van slechts één DROP clausule per ALTER TABLE verklaring.

Laat de laatste kolom vallen

Bij sommige RDBM's kunt u de laatste kolom in de tabel laten vallen, waardoor er een lege tabel zonder kolommen overblijft. Dit is een uitbreiding van de SQL-standaard (die geen tabellen met nulkolommen toestaat).

In PostgreSQL heb ik bijvoorbeeld de volgende instructie gebruikt om de laatst overgebleven kolom in de tabel te laten vallen

ALTER TABLE t1 
DROP COLUMN c3;

Resultaat:

Commands completed successfully

Maar in SQL Server, als ik hetzelfde doe:

ALTER TABLE t1 
DROP COLUMN c1, c2, c3;

Resultaat:

Msg 4923, Level 16, State 1, Line 1
ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.

Merk op dat ondanks de formulering van deze foutmelding, c3 niet de enige overgebleven kolom was. Er waren eigenlijk drie kolommen. Echter, c3 zou de laatste zijn geweest als de andere twee waren weggelaten. In dit geval is geen van de drie kolommen daadwerkelijk verwijderd.

Hoe dan ook, zelfs als ik de andere twee zou laten vallen, zou SQL Server weigeren de laatste te laten vallen.

MySQL weigert ook om de laatste kolom in een tabel te laten vallen.

Als het je bedoeling is om de tafel te laten vallen, gebruik dan DROP TABLE .

Beperkingen door RDBMS

Hoewel de basis DROP COLUMN syntaxis is vrij gelijkaardig in de meeste grote RDBMS'en, elk RDBMS heeft meestal zijn eigen beperkingen voor wanneer een kolom wel of niet zal worden verwijderd.

Hier zijn enkele van de beperkingen van enkele van de belangrijkste RDBMS'en.

SQL-server

Een kolom kan niet worden verwijderd als deze:

  • Gebruikt in een index, als sleutelkolom of als INCLUDE
  • Gebruikt in een CHECK , FOREIGN KEY , UNIQUE , of PRIMARY KEY beperking.
  • Geassocieerd met een standaard die is gedefinieerd met de DEFAULT trefwoord, of gebonden aan een standaardobject.
  • Gebonden aan een regel.

Bron voor SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql

MySQL

Als kolommen uit een tabel worden verwijderd, worden de kolommen ook verwijderd uit elke index waarvan ze deel uitmaken. Als alle kolommen waaruit een index bestaat worden verwijderd, wordt de index ook verwijderd.

Bron voor MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

PostgreSQL

Indexen en tabelbeperkingen met betrekking tot de kolom worden ook automatisch verwijderd.

Multivariate statistieken die verwijzen naar de verwijderde kolom worden ook verwijderd als het verwijderen van de kolom ertoe zou leiden dat de statistieken gegevens voor slechts één kolom bevatten.

U moet CASCADE . gebruiken als iets buiten de tabel afhankelijk is van de kolom, bijvoorbeeld externe sleutels of views.

Bron voor PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html

SQLite

SQLite ondersteunt de DROP COLUMN niet syntaxis. U kunt geen kolom in SQLite laten vallen.

Als u een kolom in SQLite moet neerzetten, is het raadzaam het 12-stappenproces te volgen dat wordt aanbevolen in de SQLite-documentatie.

Bron voor SQLite:https://sqlite.org/lang_altertable.html#otheralter

MariaDB

Als de kolom deel uitmaakt van een index, wordt de kolom daaruit verwijderd, behalve als u tegelijkertijd een nieuwe kolom met dezelfde naam toevoegt. De index wordt verwijderd als alle kolommen uit de index zijn verwijderd. Als de kolom in een weergave of trigger is gebruikt, krijgt u de volgende keer dat de weergave of trigger wordt geopend een foutmelding.

Van MariaDB 10.2.8, een kolom laten vallen die deel uitmaakt van een UNIQUE met meerdere kolommen beperking is niet toegestaan.

MariaDB accepteert RESTRICT en CASCADE om het overzetten van andere databasesystemen gemakkelijker te maken, maar in MariaDB doen ze niets.

MariaDB 10.4.0 ondersteunt instant DROP COLUMN . DROP COLUMN van een geïndexeerde kolom zou DROP INDEX . betekenen (en in het geval van een niet-UNIQUE index met meerdere kolommen, mogelijk ADD INDEX ). Deze zijn niet toegestaan ​​met ALGORITHM=INSTANT , maar in tegenstelling tot voorheen kunnen ze worden toegestaan ​​met ALGORITHM=NOCOPY .

Bron voor MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column


  1. Aan de slag met SQL Server 2017 op Linux in de Azure-portal

  2. Spring Data JPA Auditing werkt niet voor de JpaRepository-updatemethode met @Modifying-annotatie, waarom?

  3. MySQL Buitenlandse sleutel toevoegen

  4. Hoe de volgorde in postgres opnieuw in te stellen en de id-kolom te vullen met nieuwe gegevens?