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
, ofPRIMARY 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