I SQL, hvis du vil fjerne en kolonne fra en tabel, skal du bruge ALTER TABLE
sætning med DROP COLUMN
klausul.
Det fjerner kolonnen og alle dens data.
Syntaks
Syntaksen ser sådan ud:
ALTER TABLE table_name
DROP COLUMN column_name;
Nogle RDBMS'er accepterer en valgfri HVIS EKSISTERER
argument, som betyder, at det ikke returnerer en fejl, hvis kolonnen ikke eksisterer.
Nogle RDBMS'er accepterer også valgfri CASCADE
og RESTRICT
argumenter, som angiver, hvad der skal gøres, hvis kolonnen har nogen afhængigheder. Se nedenfor for mere om dette.
Eksempel
Her er et eksempel til at demonstrere.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Dette fjerner ProductDescription
kolonne fra Produkter
tabel.
HVIS FINDER Argument
Afhængigt af dit RDBMS kan du muligvis bruge HVIS FINDER
argument, som kun betinget sletter kolonnen, hvis den allerede eksisterer.
Fordelen ved at gøre dette er, at du ikke får en fejl, hvis kolonnen ikke eksisterer.
Eksempel:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Begræns ændringen
Afhængigt af dit RDBMS kan du muligvis bruge CASCADE
og RESTRICT
argumenter for at angive, hvad der skal gøres, hvis kolonnen har nogen afhængigheder, såsom fremmednøgler eller visninger.
BEGRÆNSNING
er typisk standardadfærden, så hvis du ikke angiver nogen af disse argumenter, vil DBMS nægte at droppe kolonnen, hvis der er nogen afhængige objekter.
Eksempel:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Når du bruger ovenstående sætning, hvis kolonnen har nogen afhængigheder, vil drop-operationen mislykkes, og du får en fejl.
Her er fejlen, jeg får i PostgreSQL, når jeg forsøger at slippe en tabel, der refereres til af en visning:
cannot drop column productdescription of table products because other objects depend on it
Kaskade ændringen
Brug af CASCADE
vil få alle afhængige objekter til at blive slettet.
Her er, hvad der sker, hvis jeg ændrer det forrige eksempel til CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Resultat:
NOTICE: drop cascades to view vproducts Commands completed successfully
I dette tilfælde blev kolonnen droppet, og jeg fik en besked, der forklarer, at visningen kaldet vproducts
blev også droppet.
CASCADE
og RESTRICT
understøttes i PostgreSQL, men ikke i SQL Server eller MySQL. Begge søgeord kan bruges i MariaDB, men de har ingen effekt.
Oracle accepterer en CASCADE CONSTRAINTS
klausul, som fjerner alle begrænsninger for fremmednøgle, der refererer til de primære og unikke nøgler, der er defineret på de slettede kolonner, såvel som alle begrænsninger med flere kolonner, der er defineret på de slettede kolonner.
Slip flere kolonner
Nogle RDBM'er tillader dig at slippe flere kolonner inden for en enkelt ALTER TABLE
udmelding. Syntaksen varierer mellem RDBMS.
I SQL Server kan du blot liste hver kolonne adskilt af et komma:
ALTER TABLE t1
DROP COLUMN c1, c2;
I andre RDBMS'er (såsom MySQL og PostgreSQL) skal du omskrive DROP COLUMN
for hver kolonne:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Bemærk, at denne syntaks er en udvidelse til SQL, og den er ikke i overensstemmelse med SQL-standarden om kun at have én DROP
klausul pr. ALTER TABLE
erklæring.
Slip den sidste kolonne
Nogle RDBM'er giver dig mulighed for at slette den sidste kolonne i tabellen, og efterlader derfor en tom tabel uden kolonner. Dette er en udvidelse af SQL-standarden (som ikke tillader nul-kolonne tabeller).
For eksempel, i PostgreSQL brugte jeg følgende sætning til at slippe den sidste resterende kolonne i tabellen
ALTER TABLE t1
DROP COLUMN c3;
Resultat:
Commands completed successfully
Men i SQL Server, hvis jeg gør det samme:
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.
Bemærk, at på trods af ordlyden af denne fejlmeddelelse, var c3 ikke den eneste tilbageværende kolonne. Der var faktisk tre kolonner. Men c3 ville have været den sidste tilbage, hvis de to andre var blevet droppet. I dette tilfælde blev ingen af de tre kolonner faktisk droppet.
Uanset hvad, selvom jeg droppede de to andre, ville SQL Server nægte at droppe den sidste.
MySQL nægter også at droppe den sidste kolonne i en tabel.
Hvis din hensigt er at droppe tabellen, skal du bruge DROP TABLE
.
Begrænsninger af RDBMS
Selvom den grundlæggende DROP COLUMN
syntaks er temmelig ens på tværs af de fleste af de store RDBMS'er, hver RDBMS har en tendens til at have sine egne begrænsninger for, hvornår en kolonne vil blive slettet eller ikke.
Her er nogle af begrænsningerne fra nogle af de store RDBMS'er.
SQL-server
En kolonne kan ikke slettes, når den er:
- Bruges i et indeks, enten som en nøglekolonne eller som en
INCLUDE
- Bruges i en
CHECK
,UDLANDS NØGLE
,UNIQUE
, ellerPRIMÆR NØGLE
begrænsning. - Knyttet til en standard, der er defineret med
DEFAULT
nøgleord eller bundet til et standardobjekt. - Bundet til en regel.
Kilde til SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Hvis kolonner slettes fra en tabel, fjernes kolonnerne også fra ethvert indeks, som de er en del af. Hvis alle kolonner, der udgør et indeks, slettes, slettes indekset også.
Kilde til MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Indekser og tabelbegrænsninger, der involverer kolonnen, slettes også automatisk.
Multivariat statistik, der refererer til den slettede kolonne, vil også blive fjernet, hvis fjernelse af kolonnen ville medføre, at statistikken kun indeholder data for en enkelt kolonne.
Du skal bruge CASCADE
hvis noget uden for tabellen afhænger af kolonnen, f.eks. fremmednøgler eller visninger.
Kilde til PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite understøtter ikke DROP COLUMN
syntaks. Du kan ikke slippe en kolonne i SQLite.
Hvis du har brug for at slippe en kolonne i SQLite, anbefales det, at du følger den 12-trins-proces, der anbefales i SQLite-dokumentationen.
Kilde til SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Hvis kolonnen er en del af et indeks, vil kolonnen blive slettet fra dem, undtagen hvis du tilføjer en ny kolonne med identisk navn på samme tid. Indekset vil blive slettet, hvis alle kolonner fra indekset blev slettet. Hvis kolonnen blev brugt i en visning eller trigger, vil du få en fejl, næste gang visningen eller triggeren åbnes.
Fra MariaDB 10.2.8 slettes en kolonne, der er en del af en multi-kolonne UNIQUE
begrænsning er ikke tilladt.
MariaDB accepterer RESTRICT
og CASCADE
for at gøre portering fra andre databasesystemer lettere, men i MariaDB gør de ingenting.
MariaDB 10.4.0 understøtter øjeblikkelig DROP COLUMN
. SLIP KOLONNE
af en indekseret kolonne ville indebære DROP INDEX
(og i tilfælde af en ikke-UNIQUE
multi-kolonne indeks, muligvis ADD INDEX
). Disse vil ikke være tilladt med ALGORITHM=INSTANT
, men i modsætning til tidligere, kan de tillades med ALGORITHM=NOCOPY
.
Kilde til MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column