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

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

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 nebo RESTRICT .

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 bez TEMPORARY 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.


  1. UID – vrátí ID aktuální relace v Oracle

  2. desetinné (s,p) nebo číslo (s,p)?

  3. Smazání PostgreSQL s vnitřním spojením

  4. Jak mohu pracovat s vysoce přesnými desetinnými místy v PHP