В SQL, ако искате да премахнете таблица от база данни, трябва да използвате DROP TABLE
изявление.
Това унищожава таблицата и всички нейни данни.
Синтаксис
Стандартният синтаксис на SQL е така:
DROP TABLE <table name> <drop behavior>
Къде:
<table name>
е името на таблицата, която искате да премахнете.<drop behavior>
посочва всякакви опции. Те могат да бъдат илиCASCADE
илиRESTRICT
.
Някои RDBMS също приемат опция IF EXISTS
аргумент, което означава, че няма да върне грешка, ако таблицата не съществува.
Някои RDBMS (като MySQL и MariaDB) също приемат незадължителен TEMPORARY
ключова дума, за да се гарантира, че само временните таблици ще бъдат отхвърлени.
Oracle също приема PURGE
клауза, която го изчиства от кошчето.
Пример
Ето пример за демонстрация.
DROP TABLE t1;
Изпълнението на този код премахва таблицата, наречена t1
и всички негови данни.
IF EXISTS
Клауза
Ето пример за използване на IF EXISTS
клауза, за да проверите дали таблицата вече съществува.
DROP TABLE IF EXISTS t1;
Използване на IF EXISTS
гарантира, че няма да получим грешка, ако таблицата не съществува.
Ето какво се случва, ако премахнем IF EXISTS
от изявлението:
DROP TABLE t1;
Резултат:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Това е съобщението, върнато от SQL Server. Вашето съобщение ще зависи от СУБД, която използвате.
Зависими външни ключове и изгледи
Някои RDBMS позволяват по избор RESTRICT
или CASCADE
ключова дума, която указва какво се случва, ако таблицата има външни ключове или изгледи, които я препращат.
RESTRICT
Опция
Ето пример за използване на RESTRICT
когато се опитвате да пуснете таблица, която е посочена от външен ключ в друга таблица:
DROP TABLE t1 RESTRICT;
Резултат:
cannot drop table t1 because other objects depend on it
Този пример е направен с помощта на PostgreSQL. RESTRICT
е опцията по подразбиране, така че щяхме да получим същия резултат дори ако не бяхме включили RESTRICT
ключова дума.
CASCADE
Опция
Ето какво се случва, ако преминем към CASCADE
когато се опитвате да махнете същата таблица (която се позовава от външен ключ в друга таблица):
DROP TABLE t1 CASCADE;
Резултат:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Това свали външния ключ, който препращаше към нашия t1
маса. Външният ключ беше наречен t2_c2_fkey
.
Имайте предвид, че не изпусна таблицата, която имаше външния ключ. Изпусна само външния ключ.
Ако целевата таблица (t1
) е посочен от всякакви изгледи, целият изглед щеше да бъде премахнат.
Не е необходимо да посочвате CASCADE
за да премахнете всички индекси, правила, тригери или ограничения, които съществуват за целевата таблица. Те се отхвърлят автоматично, дори когато се използва опцията по подразбиране (RESTRICT
).
MySQL и MariaDB
Някои СУБД (като MySQL и MariaDB) приемат RESTRICT
и CASCADE
ключови думи, но те не правят нищо. Те са предоставени просто за по-лесна преносимост между СУБД.
Оракул
Oracle има малко по-различен синтаксис, CASCADE CONSTRAINTS
, което премахва всички ограничения за референтна цялост, които се отнасят до първични и уникални ключове в изпуснатата таблица.
SQL сървър
SQL Server не поддържа CASCADE
или RESTRICT
ключови думи. Ако таблицата има някакви зависимости от външни ключове, ще трябва да ги махнете, преди да пуснете таблицата, в противен случай ще получите грешка.
Въпреки това, в SQL Server можете да пуснете таблица, дори ако е препраткана от изглед или съхранена процедура. Следователно, трябва да проверите за такива препратки и изрично да ги пуснете, като използвате DROP VIEW
или DROP PROCEDURE
.
SQLite
SQLite не поддържа CASCADE
или RESTRICT
ключови думи.
Ако целевата таблица е препраткана от някакви изгледи, таблицата пак ще бъде изпусната (и изгледът ще остане).
Ако целевата таблица е посочена от външни ключове, резултатът ще зависи от това дали имате активирани външни ключове и ако е така, дали има някакви данни в дъщерната таблица и ако е така, дали външният ключ е дефиниран с ON DELETE CASCADE
.
Ако използвате SQLite, вижте SQLite DROP TABLE
за пример и обсъждане на отпадане на таблица, която се позовава от външен ключ.
Изхвърлете няколко таблици
Някои RDBMS ви позволяват да изтриете множество таблици от един DROP TABLE
изявление.
Пример:
DROP TABLE t11, t12;
RDBMS, които поддържат този синтаксис, включват SQL Server, MySQL, MariaDB и PostgreSQL.
Ако обаче пускате таблица, която е посочена от външен ключ и този външен ключ предотвратява отпадането й, ще трябва да посочите дъщерната таблица преди таблицата-родител.
Например, ако изпълня горния израз в SQL Server, получавам следната грешка:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
В този случай мога просто да променя реда на таблиците в моя DROP TABLE
изявление:
DROP TABLE t12, t11;
Всъщност в този случай получих друга грешка, която ми казва, че t12
не съществува.
Ето какво получих:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Това е така, защото, въпреки че предишното изявление не можа да изпусне t11
, всъщност беше успешен при премахването на t12
.
И точно като комедия от грешки, този път успя да изпусне t11
но не и t12
.
Независимо от това и двете таблици вече са отпаднали.
Но ако поръчката е правилна от първия път, трябва да получите съобщение като това:
Commands completed successfully.
ВРЕМЕННАТА ключова дума
Някои RDBMS (като MySQL и MariaDB) приемат TEMPORARY
ключова дума.
Той минава между DROP
и TABLE
, като това:
DROP TEMPORARY TABLE t1;
Използване на TEMPORARY
ключова дума ще гарантира, че няма да изпуснете случайно невременна таблица, когато се опитвате да изпуснете временна таблица.
TEMPORARY
ключова дума има следните ефекти:
- Изявлението отпада само
TEMPORARY
таблици. - Изявлението не предизвиква неявно завършване (с помощта на
DROP TABLE
безTEMPORARY
ключова дума автоматично записва текущата активна транзакция). - Не са проверени права за достъп. A
TEMPORARY
таблицата се вижда само със сесията, която я е създала, така че не е необходима проверка.
Клаузата за прочистване
Oracle има опция PURGE
клауза, която можете да използвате, ако искате да пуснете таблицата и да освободите пространството, свързано с нея, с една стъпка. Ако посочите PURGE
, тогава базата данни не поставя таблицата и зависимите от нея обекти в кошчето.
Това е еквивалентно на първо изпускане на таблицата и след това изчистване от кошчето, но ви позволява да запазите една стъпка в процеса.
Имайте предвид, че ако посочите PURGE
, няма да можете да възстановите таблицата.
Ако не посочите PURGE
, DROP
TABLE
операторът не води до освобождаване на пространство обратно в пространството за таблици за използване от други обекти и пространството продължава да се отчита към квотата на потребителя.