sql >> Databasteknik >  >> RDS >> Database

SQL DROP COLUMN för nybörjare

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


  1. EXTRACT() Exempel – MySQL

  2. Postgres saknar FROM-klausulinmatningsfel på fråga med WITH-sats

  3. Vilket är det bästa PostgreSQL-gränssnittet? Jämförelse 2021

  4. if (välj antal (kolumn) från tabellen)> 0 då