sql >> Database teknologi >  >> RDS >> Database

SQL DROP KOLONNE for begyndere

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 , eller PRIMÆ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


  1. Hvordan pg_sleep_until() virker i PostgreSQL

  2. Forespørgselskolonner navne fra en tabel fra en anden bruger

  3. Sådan viser du alle Oracle-databaseprivilegier for en bruger

  4. Best Practices for MySQL-replikering