W SQLite możesz upuścić tabelę za pomocą DROP TABLE
oświadczenie.
Opcjonalnie możesz dodać IF EXISTS
klauzula, aby pominąć wszelkie błędy, które mogą wystąpić, jeśli tabela nie istnieje.
Ponadto, jeśli do tabeli odwołuje się klucz obcy, należy pamiętać o kilku rzeczach.
Przykład
Oto przykład demonstrujący najprostszy sposób upuszczania tabeli w SQLite:
DROP TABLE t1;
Spowoduje to usunięcie tabeli o nazwie t1
.
Możesz opcjonalnie poprzedzić nazwę tabeli nazwą schematu.
Korzystanie z IF EXISTS
Klauzula
Możesz użyć IF EXISTS
klauzula, aby pominąć wszelkie błędy, które mogą wystąpić w przypadku, gdy tabela nie istnieje.
DROP TABLE IF EXISTS t2;
Jeśli usuniemy IF EXISTS
klauzuli i uruchom ją ponownie, pojawi się błąd.
Przykład:
DROP TABLE t2;
Wynik:
Error: no such table: t2
Zależności klucza obcego i widoku
SQLite nie obsługuje CASCADE
i RESTRICT
słowa kluczowe, które są zawarte w standardzie SQL i są obsługiwane przez niektóre inne RDBMS (takie jak PostgreSQL). Te słowa kluczowe mają na celu określenie, co zrobić, gdy tabela docelowa ma zależności (takie jak widok lub klucz obcy, który odwołuje się do tabeli).
Biorąc pod uwagę, że SQLite nie obsługuje tych słów kluczowych, oto jak SQLite radzi sobie z widokami i kluczami obcymi podczas próby usunięcia tabeli.
SQLite ignoruje wszelkie zależne widoki. Innymi słowy, idzie naprzód i porzuca tabelę, nawet jeśli istnieje widok, który się do niej odwołuje.
Jeśli chodzi o klucze obce…
Po pierwsze, klucze obce są domyślnie wyłączone w SQLite. Tak więc, o ile ich nie włączysz, wszelkie klucze obce, które odwołują się do tabeli docelowej, nie będą miały wpływu na usuwanie tabeli docelowej. Innymi słowy, tabela zostanie usunięta.
Jeśli klucze obce są włączone w Twojej sesji, zapobiegną one usunięciu tabeli tylko wtedy, gdy istnieją dane, które naruszą ten klucz obcy. Jeśli tabela podrzędna nie zawiera danych, tabela nadrzędna zostanie usunięta bez błędu. Jeśli tabela podrzędna zawiera dane (przypuszczalnie zawierające dane odwołujące się do klucza podstawowego tabeli nadrzędnej), spowoduje to błąd i tabela nie zostanie usunięta.
Tak:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Wynik:
Error: FOREIGN KEY constraint failed
Powodem, dla którego działa to w ten sposób, jest to, że SQLite wykonuje niejawne DELETE FROM
operacji przed upuszczeniem stołu. Jeśli DELETE FROM
operacja powoduje naruszenie klucza obcego, wtedy otrzymujemy błąd. Ale jeśli w tabeli nie ma danych, to każdy DELETE FROM
operacja nie spowoduje naruszenia klucza obcego, a tabela może zostać usunięta.
Krótko mówiąc, to nie jest DROP TABLE
operacja, która powoduje jakiekolwiek naruszenia klucza obcego, jest to niejawne DELETE FROM
operacja.
Kiedy klucz obcy używa ON DELETE CASCADE
Jeśli jednak ograniczenie klucza obcego jest zdefiniowane za pomocą ON DELETE CASCADE
, tabela nadrzędna zostanie usunięta, a wszystkie wiersze, które odwołują się do kolumny klucza podstawowego tej tabeli, zostaną usunięte z tabeli podrzędnej.
Oto przykład.
Utwórz tabele i wstawiaj dane:
CREATE TABLE t11 (
c1 integer PRIMARY KEY AUTOINCREMENT
);
CREATE TABLE t12 (
c1 integer PRIMARY KEY AUTOINCREMENT,
c2 integer REFERENCES t11 (c1) ON DELETE CASCADE
);
INSERT INTO t11 VALUES (1);
INSERT INTO t12 VALUES (1, 1);
Wybierz dane:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Upuść tabelę nadrzędną i przejrzyj wszystkie tabele:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Widzimy, że t11
już nie istnieje, ale t12
nadal istnieje.
Sprawdź klucz obcy na t12
:
sqlite> PRAGMA foreign_key_list(t12);
id seq table from to on_update on_delete match
-- --- ----- ---- -- --------- --------- -----
0 0 t11 c2 c1 NO ACTION CASCADE NONE
Tak, to nadal istnieje i możemy potwierdzić, że ma ON DELETE CASCADE
.
Wybierz dane z t12
:
sqlite> SELECT * FROM t12;
sqlite>
Żadne wiersze nie są zwracane. Dzieje się tak, ponieważ ON DELETE CASCADE
opcja klucza obcego zapewniała, że wiersz został usunięty, gdy tabela nadrzędna (t11
) został usunięty (a dokładniej, gdy jego dane zostały usunięte za pomocą niejawnego DELETE FROM
operacja przed upuszczeniem).
Upuszczanie klucza obcego
SQLite w rzeczywistości nie obsługuje upuszczania kluczy obcych. Zwykle w SQL upuszczasz klucze obce za pomocą ALTER TABLE
instrukcja, ale ALTER TABLE
SQLite implementacja nie pozwala na usuwanie ograniczeń.
Jest jednak sposób na poradzenie sobie z tą sytuacją. Zobacz Jak usunąć klucz obcy w SQLite na przykład.