sql >> Databáze >  >> RDS >> Database

SQL DROP COLUMN pro začátečníky

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 nebo PRIMARY 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


  1. Jak získat přístup k vestavěné šabloně CRM v aplikaci Microsoft Access

  2. Zbavte se duplicitních hodnot v jednom sloupci ve výběru dvou sloupců

  3. Jak vyřešit nemožnost přepnout chybu kódování při vkládání XML do SQL Serveru

  4. Jak získat záznamy náhodně z databáze Oracle?