V SQL, pokud chcete odstranit tabulku z databáze, musíte použít DROP TABLE
prohlášení.
To zničí tabulku a všechna její data.
Syntaxe
Standardní syntaxe SQL vypadá takto:
DROP TABLE <table name> <drop behavior>
Kde:
<table name>
je název tabulky, kterou chcete zrušit.<drop behavior>
specifikuje libovolné možnosti. Mohou to být buďCASCADE
neboRESTRICT
.
Některé RDBMS také přijímají volitelný IF EXISTS
argument, což znamená, že pokud tabulka neexistuje, nevrátí chybu.
Některé RDBMS (jako MySQL a MariaDB) také přijímají volitelný TEMPORARY
klíčové slovo, aby bylo zajištěno, že budou zrušeny pouze dočasné tabulky.
Oracle také přijímá PURGE
klauzule, která jej vyčistí z koše.
Příklad
Zde je příklad k demonstraci.
DROP TABLE t1;
Spuštěním tohoto kódu zmizí tabulka nazvaná t1
a všechna jeho data.
Položka IF EXISTS
Ustanovení
Zde je příklad použití IF EXISTS
klauzule ke kontrole, zda tabulka již existuje.
DROP TABLE IF EXISTS t1;
Pomocí IF EXISTS
zajišťuje, že v případě, že tabulka neexistuje, nedostaneme chybu.
Zde je to, co se stane, když odstraníme IF EXISTS
z výpisu:
DROP TABLE t1;
Výsledek:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
To je zpráva vrácená serverem SQL. Vaše zpráva bude záviset na DBMS, kterou používáte.
Závislé cizí klíče a zobrazení
Některé RDBMS umožňují volitelné RESTRICT
nebo CASCADE
klíčové slovo, které určuje, co se stane, pokud tabulka obsahuje cizí klíče nebo pohledy, které na ni odkazují.
RESTRICT
Možnost
Zde je příklad použití RESTRICT
při pokusu o zrušení tabulky, na kterou odkazuje cizí klíč v jiné tabulce:
DROP TABLE t1 RESTRICT;
Výsledek:
cannot drop table t1 because other objects depend on it
Tento příklad byl proveden pomocí PostgreSQL. RESTRICT
je výchozí možnost, takže bychom dostali stejný výsledek, i kdybychom nezahrnuli RESTRICT
klíčové slovo.
CASCADE
Možnost
Zde je to, co se stane, když přepneme na CASCADE
při pokusu o zrušení stejné tabulky (na kterou odkazuje cizí klíč v jiné tabulce):
DROP TABLE t1 CASCADE;
Výsledek:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Tím byl odstraněn cizí klíč, který odkazoval na náš t1
stůl. Cizí klíč se jmenoval t2_c2_fkey
.
Všimněte si, že nezrušil tabulku, která měla cizí klíč. Zahodil pouze cizí klíč.
Pokud cílová tabulka (t1
) byl odkazován libovolnými pohledy, celý pohled by byl vypuštěn.
Nemusíte zadávat CASCADE
zrušit všechny indexy, pravidla, spouštěče nebo omezení, která pro cílovou tabulku existují. Ty jsou automaticky zrušeny, i když používáte výchozí možnost (RESTRICT
).
MySQL a MariaDB
Některé DBMS (jako MySQL a MariaDB) přijímají RESTRICT
a CASCADE
klíčová slova, ale nic nedělají. Jsou poskytovány jednoduše pro snadnější přenositelnost mezi DBMS.
Oracle
Oracle má mírně odlišnou syntaxi CASCADE CONSTRAINTS
, který zruší všechna omezení referenční integrity, která odkazují na primární a jedinečné klíče v zrušené tabulce.
SQL Server
SQL Server nepodporuje CASCADE
nebo RESTRICT
klíčová slova. Pokud má tabulka nějaké závislosti na cizím klíči, budete je muset před zrušením tabulky zrušit, jinak se zobrazí chyba.
Na serveru SQL však můžete tabulku zrušit, i když na ni odkazuje pohled nebo uložená procedura. Proto byste měli zkontrolovat všechny takové odkazy a explicitně je vypustit pomocí DROP VIEW
nebo DROP PROCEDURE
.
SQLite
SQLite nepodporuje CASCADE
nebo RESTRICT
klíčová slova.
Pokud na cílovou tabulku odkazují nějaké pohledy, tabulka bude stále zrušena (a pohled zůstane).
Pokud na cílovou tabulku odkazují cizí klíče, bude výsledek záviset na tom, zda máte povoleny cizí klíče, a pokud ano, zda jsou v podřízené tabulce nějaká data, a pokud ano, zda je cizí klíč definován pomocí ON DELETE CASCADE
.
Pokud používáte SQLite, podívejte se na SQLite DROP TABLE
pro příklad a diskusi o odstranění tabulky, na kterou odkazuje cizí klíč.
Vypustit více tabulek
Některé RDBMS umožňují zrušit více tabulek z jedné DROP TABLE
prohlášení.
Příklad:
DROP TABLE t11, t12;
Mezi RDBMS, které podporují tuto syntaxi, patří SQL Server, MySQL, MariaDB a PostgreSQL.
Pokud však rušíte tabulku, na kterou odkazuje cizí klíč, a tento cizí klíč brání jejímu zrušení, budete muset uvést podřízenou tabulku před nadřazenou tabulkou.
Pokud například spustím výše uvedený příkaz v SQL Server, zobrazí se následující chyba:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
V tomto případě mohu jednoduše změnit pořadí tabulek v mé DROP TABLE
prohlášení:
DROP TABLE t12, t11;
Ve skutečnosti v tomto případě mám další chybu, která mi říká, že t12
neexistuje.
Tady je to, co mám:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Je to proto, že i když předchozí příkaz nemohl vypustit t11
, bylo ve skutečnosti úspěšné v odstranění t12
.
A stejně jako komedie chyb i tentokrát dokázala vypustit t11
ale ne t12
.
Bez ohledu na to byly nyní oba stoly zrušeny.
Ale pokud se vám objednávka povede správně hned napoprvé, měli byste obdržet zprávu jako:
Commands completed successfully.
Klíčové slovo TEMPORARY
Některé RDBMS (jako MySQL a MariaDB) přijímají TEMPORARY
klíčové slovo.
Pohybuje se mezi DROP
a TABLE
, takto:
DROP TEMPORARY TABLE t1;
Pomocí TEMPORARY
klíčové slovo zajistí, že při pokusu o zrušení dočasné tabulky omylem nezrušíte nedočasnou tabulku.
TEMPORARY
klíčové slovo má následující účinky:
- Příkaz se zruší pouze
TEMPORARY
tabulky. - Příkaz nezpůsobí implicitní potvrzení (pomocí
DROP TABLE
bezTEMPORARY
klíčové slovo automaticky potvrdí aktuální aktivní transakci). - Nejsou zaškrtnuta žádná přístupová práva.
TEMPORARY
tabulka je viditelná pouze u relace, která ji vytvořila, takže není nutná žádná kontrola.
Ustanovení o očištění
Oracle má volitelnou možnost PURGE
klauzuli, kterou můžete použít, pokud chcete tabulku zrušit a uvolnit prostor s ní spojený v jediném kroku. Pokud zadáte PURGE
, pak databáze neumístí tabulku a její závislé objekty do koše.
To se rovná prvnímu vypuštění tabulky a následnému vyčištění z koše, ale umožňuje vám to uložit jeden krok v procesu.
Všimněte si, že pokud zadáte PURGE
, nebudete moci tabulku obnovit.
Pokud nezadáte PURGE
, DROP
TABLE
nevede k uvolnění prostoru zpět do tabulkového prostoru pro použití jinými objekty a prostor se nadále započítává do kvóty prostoru uživatele.