V SQL, pokud chcete odstranit sloupec z tabulky, musíte použít ALTER TABLE
příkaz s DROP COLUMN
doložka.
Tím se sloupec a všechna jeho data odstraní.
Syntaxe
Syntaxe vypadá takto:
ALTER TABLE table_name
DROP COLUMN column_name;
Některé RDBMS přijímají volitelný IF EXISTS
argument, což znamená, že pokud sloupec neexistuje, nevrátí chybu.
Některé RDBMS také přijímají volitelný CASCADE
a RESTRICT
argumenty, které určují, co dělat, pokud má sloupec nějaké závislosti. Více o tom naleznete níže.
Příklad
Zde je příklad k demonstraci.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Tím se odstraní ProductDescription
ze sloupce Products
tabulka.
Položka IF EXISTS
Argument
V závislosti na vašem RDBMS možná budete moci použít IF EXISTS
argument, který podmíněně zruší sloupec pouze v případě, že již existuje.
Výhodou toho je, že pokud sloupec neexistuje, neobdržíte chybu.
Příklad:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Omezit změnu
V závislosti na vašem RDBMS možná budete moci použít CASCADE
a RESTRICT
argumenty určující, co dělat, pokud má sloupec nějaké závislosti, jako jsou cizí klíče nebo pohledy.
RESTRICT
je obvykle výchozí chování, takže pokud neurčíte žádný z těchto argumentů, DBMS odmítne sloupec zrušit, pokud existují nějaké závislé objekty.
Příklad:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Pokud při použití výše uvedeného příkazu má sloupec nějaké závislosti, operace zrušení selže a zobrazí se chyba.
Zde je chyba, kterou dostávám v PostgreSQL, když se pokouším zrušit tabulku, na kterou odkazuje pohled:
cannot drop column productdescription of table products because other objects depend on it
Cascade the Change
Pomocí CASCADE
způsobí zrušení všech závislých objektů.
Zde je to, co se stane, když změním předchozí příklad na CASCADE
:
ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Výsledek:
NOTICE: drop cascades to view vproducts Commands completed successfully
V tomto případě byl sloupec vynechán a dostal jsem zprávu vysvětlující, že zobrazení se nazývá vproducts
bylo také upuštěno.
CASCADE
a RESTRICT
jsou podporovány v PostgreSQL, ale ne v SQL Server nebo MySQL. Obě klíčová slova lze použít v MariaDB, ale nemají žádný účinek.
Oracle přijímá CASCADE CONSTRAINTS
klauzule, která zruší všechna omezení cizího klíče, která odkazují na primární a jedinečné klíče definované ve vynechaných sloupcích, stejně jako všechna omezení pro více sloupců definovaná na vynechaných sloupcích.
Vypustit více sloupců
Některé RDBM umožňují vypustit více sloupců v rámci jedné ALTER TABLE
prohlášení. Syntaxe se mezi RDBMS liší.
V SQL Server můžete jednoduše vypsat každý sloupec oddělený čárkou:
ALTER TABLE t1
DROP COLUMN c1, c2;
V jiných RDBMS (jako je MySQL a PostgreSQL) byste museli přepsat DROP COLUMN
pro každý sloupec:
ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Všimněte si, že tato syntaxe je rozšířením SQL a neodpovídá standardu SQL, který obsahuje pouze jeden DROP
klauzule podle ALTER TABLE
prohlášení.
Vypustit poslední sloupec
Některé RDBM umožňují vypustit poslední sloupec v tabulce, a tak ponechat prázdnou tabulku bez sloupců. Toto je rozšíření standardu SQL (který neumožňuje tabulky s nulovým sloupcem).
Například v PostgreSQL jsem použil následující příkaz k vypuštění posledního zbývajícího sloupce v tabulce
ALTER TABLE t1
DROP COLUMN c3;
Výsledek:
Commands completed successfully
Ale v SQL Server, pokud udělám totéž:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Výsledek:
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.
Všimněte si, že navzdory znění této chybové zprávy nebyl c3 jediným zbývajícím sloupcem. Ve skutečnosti byly tři sloupce. Nicméně c3 by byla poslední, která by zůstala, pokud by ostatní dvě vypadly. V tomto případě žádný ze tří sloupců ve skutečnosti nevypadl.
Ať tak či onak, i kdybych vypustil další dva, SQL Server by odmítl vypustit ten poslední.
MySQL také odmítá vypustit poslední sloupec v tabulce.
Pokud je vaším záměrem zrušit tabulku, použijte DROP TABLE
.
Omezení ze strany RDBMS
I když základní DROP COLUMN
syntaxe je u většiny hlavních RDBMS dost podobná, každý RDBMS má tendenci mít svá vlastní omezení, kdy sloupec bude nebo nebude vypuštěn.
Zde jsou některá omezení některých hlavních RDBMS.
SQL Server
Sloupec nelze vypustit, když je:
- Používá se v indexu, ať už jako klíčový sloupec nebo jako
INCLUDE
- Používá se v
CHECK
,FOREIGN KEY
,UNIQUE
neboPRIMARY KEY
omezení. - Přidruženo k výchozímu nastavení, které je definováno pomocí
DEFAULT
klíčové slovo nebo vázané na výchozí objekt. - Vázané na pravidlo.
Zdroj pro SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Pokud jsou sloupce z tabulky odstraněny, jsou odstraněny také z jakéhokoli indexu, jehož jsou součástí. Pokud jsou odstraněny všechny sloupce, které tvoří index, index je také zrušen.
Zdroj pro MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Indexy a omezení tabulek zahrnující sloupec budou také automaticky zrušeny.
Vícerozměrné statistiky odkazující na vynechaný sloupec budou také odstraněny, pokud by odstranění sloupce způsobilo, že by statistika obsahovala data pouze pro jeden sloupec.
Budete muset použít CASCADE
pokud něco mimo tabulku závisí na sloupci, například cizí klíče nebo pohledy.
Zdroj pro PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite nepodporuje DROP COLUMN
syntax. V SQLite nemůžete vypustit sloupec.
Pokud potřebujete v SQLite vypustit sloupec, doporučujeme vám postupovat podle 12 kroků doporučených v dokumentaci SQLite.
Zdroj pro SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Pokud je sloupec součástí libovolného indexu, sloupec z něj bude vypuštěn, pokud však současně nepřidáte nový sloupec se stejným názvem. Index bude zrušen, pokud byly zrušeny všechny sloupce z indexu. Pokud byl sloupec použit v zobrazení nebo spouštěči, při příštím přístupu k zobrazení nebo spouštěči se zobrazí chyba.
Z MariaDB 10.2.8 vypuštění sloupce, který je součástí vícesloupcového UNIQUE
omezení není povoleno.
MariaDB přijímá RESTRICT
a CASCADE
za účelem usnadnění portování z jiných databázových systémů, ale v MariaDB nedělají nic.
MariaDB 10.4.0 podporuje okamžitý DROP COLUMN
. DROP COLUMN
indexovaného sloupce by znamenalo DROP INDEX
(a v případě, že není UNIQUE
vícesloupcový index, případně ADD INDEX
). Tyto nebudou povoleny s ALGORITHM=INSTANT
, ale na rozdíl od dříve mohou být povoleny pomocí ALGORITHM=NOCOPY
.
Zdroj pro MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column