W SQL, jeśli chcesz usunąć tabelę z bazy danych, musisz użyć DROP TABLE
oświadczenie.
To niszczy tabelę i wszystkie jej dane.
Składnia
Standardowa składnia SQL wygląda następująco:
DROP TABLE <table name> <drop behavior>
Gdzie:
<table name>
to nazwa tabeli, którą chcesz usunąć.<drop behavior>
określa wszelkie opcje. Mogą to byćCASCADE
lubRESTRICT
.
Niektóre RDBMS akceptują również opcjonalny IF EXISTS
argument, co oznacza, że nie zwróci błędu, jeśli tabela nie istnieje.
Niektóre RDBMS (takie jak MySQL i MariaDB) akceptują również opcjonalny TEMPORARY
słowo kluczowe, aby upewnić się, że usuwane są tylko tabele tymczasowe.
Oracle akceptuje również PURGE
klauzuli, która usuwa go z kosza.
Przykład
Oto przykład do zademonstrowania.
DROP TABLE t1;
Uruchomienie tego kodu powoduje usunięcie tabeli o nazwie t1
i wszystkie jego dane.
Karta IF EXISTS
Klauzula
Oto przykład użycia IF EXISTS
klauzula, aby sprawdzić, czy tabela już istnieje.
DROP TABLE IF EXISTS t1;
Używanie IF EXISTS
zapewnia, że nie otrzymamy błędu, jeśli tabela nie istnieje.
Oto, co się stanie, jeśli usuniemy IF EXISTS
z oświadczenia:
DROP TABLE t1;
Wynik:
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 jest komunikat zwracany przez SQL Server. Twoja wiadomość będzie zależeć od systemu DBMS, którego używasz.
Zależne klucze obce i widoki
Niektóre RDBMS pozwalają na opcjonalne RESTRICT
lub CASCADE
słowo kluczowe, które określa, co się stanie, jeśli tabela ma jakiekolwiek klucze obce lub widoki, które się do niej odwołują.
RESTRICT
Opcja
Oto przykład użycia RESTRICT
podczas próby usunięcia tabeli, do której odwołuje się klucz obcy w innej tabeli:
DROP TABLE t1 RESTRICT;
Wynik:
cannot drop table t1 because other objects depend on it
Ten przykład został wykonany przy użyciu PostgreSQL. RESTRICT
jest opcją domyślną, więc otrzymalibyśmy ten sam wynik, nawet gdybyśmy nie uwzględnili RESTRICT
słowo kluczowe.
CASCADE
Opcja
Oto, co się stanie, jeśli przełączymy się na CASCADE
podczas próby usunięcia tej samej tabeli (do której odwołuje się klucz obcy w innej tabeli):
DROP TABLE t1 CASCADE;
Wynik:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Spowodowało to usunięcie klucza obcego, który odwoływał się do naszego t1
stół. Klucz obcy nazywał się t2_c2_fkey
.
Zauważ, że nie upuścił tabeli zawierającej klucz obcy. Upuścił tylko klucz obcy.
Jeśli tabela docelowa (t1
) był przywoływany przez dowolne widoki, cały widok zostałby usunięty.
Nie musisz określać CASCADE
aby usunąć wszystkie indeksy, reguły, wyzwalacze lub ograniczenia, które istnieją dla tabeli docelowej. Są one usuwane automatycznie, nawet przy użyciu domyślnej opcji (RESTRICT
).
MySQL i MariaDB
Niektóre DBMS (takie jak MySQL i MariaDB) akceptują RESTRICT
i CASCADE
słowa kluczowe, ale nic nie robią. Są one dostarczane po prostu dla łatwiejszego przenoszenia między DBMS.
Wyrocznia
Oracle ma nieco inną składnię, CASCADE CONSTRAINTS
, który usuwa wszystkie ograniczenia integralności referencyjnej, które odnoszą się do kluczy podstawowych i unikalnych w usuniętej tabeli.
Serwer SQL
SQL Server nie obsługuje CASCADE
lub RESTRICT
słowa kluczowe. Jeśli tabela ma jakiekolwiek zależności kluczy obcych, musisz je usunąć przed usunięciem tabeli, w przeciwnym razie otrzymasz błąd.
Jednak w SQL Server można upuścić tabelę, nawet jeśli odwołuje się do niej widok lub procedura składowana. Dlatego powinieneś sprawdzić, czy nie ma takich odwołań, i jawnie je usunąć za pomocą DROP VIEW
lub DROP PROCEDURE
.
SQLite
SQLite nie obsługuje CASCADE
lub RESTRICT
słowa kluczowe.
Jeśli do tabeli docelowej odwołują się jakiekolwiek widoki, tabela nadal zostanie usunięta (a widok pozostanie).
Jeśli do tabeli docelowej odwołują się jakiekolwiek klucze obce, wynik będzie zależał od tego, czy masz włączone klucze obce, a jeśli tak, to czy w tabeli podrzędnej znajdują się jakieś dane, a jeśli tak, to czy klucz obcy jest zdefiniowany za pomocą ON DELETE CASCADE
.
Jeśli używasz SQLite, zobacz SQLite DROP TABLE
na przykład i omówienie upuszczania tabeli, do której odwołuje się klucz obcy.
Upuść wiele tabel
Niektóre RDBMS umożliwiają upuszczanie wielu tabel z jednej DROP TABLE
oświadczenie.
Przykład:
DROP TABLE t11, t12;
Systemy RDBMS obsługujące tę składnię obejmują SQL Server, MySQL, MariaDB i PostgreSQL.
Jeśli jednak usuwasz tabelę, do której odwołuje się klucz obcy, a ten klucz obcy uniemożliwia jej usunięcie, musisz umieścić tabelę podrzędną przed tabelą nadrzędną.
Na przykład, jeśli uruchomię powyższą instrukcję w SQL Server, otrzymuję następujący błąd:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
W takim przypadku mogę po prostu zmienić kolejność tabel w moim DROP TABLE
oświadczenie:
DROP TABLE t12, t11;
Właściwie w tym przypadku pojawił się kolejny błąd z informacją, że t12
nie istnieje.
Oto, co mam:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Dzieje się tak, ponieważ chociaż poprzednia instrukcja nie mogła usunąć t11
, w rzeczywistości udało się usunąć t12
.
I tak jak komedia błędów, tym razem udało się wyrzucić t11
ale nie t12
.
Niezależnie od tego obie tabele zostały teraz usunięte.
Ale jeśli za pierwszym razem otrzymasz prawidłowe zamówienie, powinieneś otrzymać wiadomość taką jak ta:
Commands completed successfully.
Tymczasowe słowo kluczowe
Niektóre RDBMS (takie jak MySQL i MariaDB) akceptują TEMPORARY
słowo kluczowe.
Przechodzi pomiędzy DROP
i TABLE
, tak:
DROP TEMPORARY TABLE t1;
Korzystanie z TEMPORARY
słowo kluczowe zagwarantuje, że przypadkowo nie upuścisz tabeli tymczasowej podczas próby upuszczenia tabeli tymczasowej.
TEMPORARY
słowo kluczowe ma następujące skutki:
- Oświadczenie odrzuca tylko
TEMPORARY
stoły. - Oświadczenie nie powoduje niejawnego zatwierdzenia (przy użyciu
DROP TABLE
bezTEMPORARY
słowo kluczowe automatycznie zatwierdza bieżącą aktywną transakcję). - Żadne prawa dostępu nie są sprawdzane.
TEMPORARY
tabela jest widoczna tylko w sesji, która ją utworzyła, więc nie jest konieczne sprawdzanie.
Klauzula oczyszczania
Oracle ma opcjonalny PURGE
klauzula, której możesz użyć, jeśli chcesz usunąć tabelę i zwolnić miejsce z nią związane w jednym kroku. Jeśli określisz PURGE
, baza danych nie umieszcza tabeli i obiektów zależnych od niej w koszu.
Jest to równoważne najpierw upuszczeniu tabeli, a następnie wyczyszczeniu jej z kosza, ale pozwala to zapisać jeden krok w procesie.
Pamiętaj, że jeśli określisz PURGE
, nie będziesz w stanie odzyskać stołu.
Jeśli nie określisz PURGE
, DROP
TABLE
instrukcja nie powoduje zwolnienia miejsca z powrotem do obszaru tabel do wykorzystania przez inne obiekty, a miejsce jest nadal wliczane do limitu miejsca użytkownika.