I SQL, om du vill ta bort en kolumn från en tabell, måste du använda ALTER TABLE
sats med DROP COLUMN
klausul.
Det tar bort kolumnen och alla dess data.
Syntax
Syntaxen ser ut så här:
ALTER TABLE table_name
DROP COLUMN column_name;
Vissa RDBMS accepterar en valfri OM FINNS
argument som innebär att det inte returnerar ett fel om kolumnen inte finns.
Vissa RDBMS accepterar även valfri CASCADE
och RESTRICT
argument, som anger vad som ska göras om kolumnen har några beroenden. Se nedan för mer om detta.
Exempel
Här är ett exempel att visa.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Detta tar bort ProductDescription
kolumnen från Produkter
bord.
OM FINNS Argument
Beroende på ditt RDBMS, kanske du kan använda OM FINNS
argument, som villkorligt tar bort kolumnen endast om den redan finns.
Fördelen med att göra detta är att du inte får ett felmeddelande om kolumnen inte finns.
Exempel:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Begränsa ändringen
Beroende på din RDBMS kan du kanske använda CASCADE
och RESTRICT
argument för att specificera vad som ska göras om kolumnen har några beroenden, såsom främmande nycklar eller vyer.
RESTRICT
är vanligtvis standardbeteendet, så om du inte anger något av dessa argument, kommer DBMS att vägra släppa kolumnen om det finns några beroende objekt.
Exempel:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
När du använder ovanstående uttalande, om kolumnen har några beroenden, kommer släppoperationen att misslyckas och du får ett felmeddelande.
Här är felet jag får i PostgreSQL när jag försöker släppa en tabell som refereras av en vy:
cannot drop column productdescription of table products because other objects depend on it
Kaskadera förändringen
Använda CASCADE
alternativet gör att alla beroende objekt släpps.
Här är vad som händer om jag ändrar föregående exempel till CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Resultat:
NOTICE: drop cascades to view vproducts Commands completed successfully
I det här fallet togs kolumnen bort och jag fick ett meddelande som förklarade att vyn heter vproducts
togs också bort.
CASCADE
och RESTRICT
stöds i PostgreSQL, men inte i SQL Server eller MySQL. Båda sökorden kan användas i MariaDB men de har ingen effekt.
Oracle accepterar en CASCADE CONSTRAINTS
sats som tar bort alla begränsningar för främmande nycklar som hänvisar till de primära och unika nycklar som definierats på de släppta kolumnerna såväl som alla begränsningar med flera kolumner som definieras på de släppta kolumnerna.
Släpp flera kolumner
Vissa RDBM:er låter dig släppa flera kolumner inom en enda ALTER TABLE
påstående. Syntaxen varierar mellan RDBMS.
I SQL Server kan du helt enkelt lista varje kolumn, separerad av ett kommatecken:
ALTER TABLE t1
DROP COLUMN c1, c2;
I andra RDBMS (som MySQL och PostgreSQL) skulle du behöva skriva om DROP COLUMN
för varje kolumn:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Observera att den här syntaxen är en tillägg till SQL och den överensstämmer inte med SQL-standarden att bara ha en DROP
klausul per ALTER TABLE
uttalande.
Släpp den sista kolumnen
Vissa RDBM:er låter dig släppa den sista kolumnen i tabellen och lämnar därför en tom tabell utan kolumner. Detta är en förlängning av SQL-standarden (som inte tillåter nollkolumntabeller).
Till exempel, i PostgreSQL använde jag följande uttalande för att ta bort den sista återstående kolumnen i tabellen
ALTER TABLE t1
DROP COLUMN c3;
Resultat:
Commands completed successfully
Men i SQL Server, om jag gör samma sak:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Resultat:
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.
Observera att trots ordalydelsen i detta felmeddelande var c3 inte den enda kvarvarande kolumnen. Det fanns faktiskt tre kolumner. Men c3 skulle ha varit den sista kvar om de andra två hade tappats. I det här fallet har ingen av de tre kolumnerna faktiskt tagits bort.
Hur som helst, även om jag släppte de andra två, skulle SQL Server vägra att släppa den sista.
MySQL vägrar också att ta bort den sista kolumnen i en tabell.
Om din avsikt är att släppa tabellen, använd DROP TABLE
.
Begränsningar av RDBMS
Även om den grundläggande DROP COLUMN
syntaxen är ganska lik för de flesta stora RDBMS, varje RDBMS tenderar att ha sina egna begränsningar för när en kolumn kommer eller inte kommer att tas bort.
Här är några av begränsningarna från några av de stora RDBMS:erna.
SQL-server
En kolumn kan inte släppas när den är:
- Används i ett index, antingen som en nyckelkolumn eller som en
INCLUDE
- Används i en
CHECK
,UTLANDSNYCKEL
,UNIQUE
, ellerPRIMÄRNYCKEL
begränsning. - Kopplad till en standard som är definierad med
DEFAULT
nyckelord, eller bundet till ett standardobjekt. - Bunden till en regel.
Källa för SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Om kolumner tas bort från en tabell tas kolumnerna också bort från alla index som de är en del av. Om alla kolumner som utgör ett index tas bort, tas även indexet bort.
Källa för MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Index och tabellbegränsningar som involverar kolumnen kommer också att tas bort automatiskt.
Multivariatstatistik som refererar till den utelämnade kolumnen kommer också att tas bort om borttagningen av kolumnen skulle göra att statistiken endast innehåller data för en enda kolumn.
Du måste använda CASCADE
om något utanför tabellen beror på kolumnen, till exempel främmande nycklar eller vyer.
Källa för PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite stöder inte DROP COLUMN
syntax. Du kan inte släppa en kolumn i SQLite.
Om du behöver ta bort en kolumn i SQLite, rekommenderas det att du följer 12-stegsprocessen som rekommenderas i SQLite-dokumentationen.
Källa för SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Om kolumnen är en del av något index, kommer kolumnen att tas bort från dem, förutom om du lägger till en ny kolumn med samma namn samtidigt. Indexet kommer att tas bort om alla kolumner från indexet togs bort. Om kolumnen användes i en vy eller utlösare får du ett felmeddelande nästa gång vyn eller utlösaren öppnas.
Från MariaDB 10.2.8, släpper en kolumn som är en del av en UNIQUE
med flera kolumner begränsning är inte tillåten.
MariaDB accepterar RESTRICT
och CASCADE
för att göra portering från andra databassystem lättare, men i MariaDB gör de ingenting.
MariaDB 10.4.0 stöder omedelbar DROP COLUMN
. SLIPPA KOLUMN
av en indexerad kolumn skulle innebära DROP INDEX
(och i fallet med en icke-UNIQUE
flerkolumnsindex, eventuellt ADD INDEX
). Dessa kommer inte att tillåtas med ALGORITHM=INSTANT
, men till skillnad från tidigare kan de tillåtas med ALGORITHM=NOCOPY
.
Källa för MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column