In SQLite können Sie eine Tabelle mit DROP TABLE
löschen Aussage.
Sie können optional den IF EXISTS
hinzufügen -Klausel, um alle Fehler zu unterdrücken, die auftreten könnten, wenn die Tabelle nicht existiert.
Auch wenn die Tabelle von einem Fremdschlüssel referenziert wird, gibt es ein paar Dinge zu beachten.
Beispiel
Hier ist ein Beispiel, um die einfachste Methode zum Löschen einer Tabelle in SQLite zu demonstrieren:
DROP TABLE t1;
Dies löscht die Tabelle namens t1
.
Optional können Sie dem Tabellennamen den Schemanamen voranstellen.
Verwendung des IF EXISTS
Klausel
Sie können den IF EXISTS
verwenden -Klausel, um alle Fehler zu unterdrücken, die auftreten könnten, falls die Tabelle nicht existiert.
DROP TABLE IF EXISTS t2;
Wenn wir den IF EXISTS
entfernen -Klausel, und führen Sie sie erneut aus, erhalten wir einen Fehler.
Beispiel:
DROP TABLE t2;
Ergebnis:
Error: no such table: t2
Fremdschlüssel &View-Abhängigkeiten
SQLite unterstützt den CASCADE
nicht und RESTRICT
Schlüsselwörter, die im SQL-Standard enthalten sind und von einigen anderen RDBMS (z. B. PostgreSQL) unterstützt werden. Diese Schlüsselwörter sollen angeben, was zu tun ist, wenn die Zieltabelle Abhängigkeiten hat (z. B. eine Ansicht oder ein Fremdschlüssel, der auf die Tabelle verweist).
Da SQLite diese Schlüsselwörter nicht unterstützt, geht SQLite wie folgt mit Ansichten und Fremdschlüsseln um, wenn Sie versuchen, eine Tabelle zu löschen.
SQLite ignoriert alle abhängigen Ansichten. Mit anderen Worten, es geht weiter und löscht die Tabelle, selbst wenn es eine Ansicht gibt, die darauf verweist.
Was Fremdschlüssel angeht…
Erstens sind Fremdschlüssel in SQLite standardmäßig deaktiviert. Wenn Sie sie also nicht aktivieren, haben alle Fremdschlüssel, die auf die Zieltabelle verweisen, keine Auswirkung auf das Löschen der Zieltabelle. Mit anderen Worten, die Tabelle wird gelöscht.
Wenn Fremdschlüssel in Ihrer Sitzung aktiviert sind, verhindern sie das Löschen der Tabelle nur, wenn Daten vorhanden sind, die diesen Fremdschlüssel verletzen. Wenn Ihre untergeordnete Tabelle keine Daten enthält, wird die übergeordnete Tabelle ohne Fehler gelöscht. Wenn die untergeordnete Tabelle Daten enthält (vermutlich einschließlich Daten, die auf den Primärschlüssel der übergeordneten Tabelle verweisen), führt dies zu einem Fehler und die Tabelle wird nicht gelöscht.
So:
PRAGMA foreign_keys = ON;
DROP TABLE t1;
Ergebnis:
Error: FOREIGN KEY constraint failed
Der Grund dafür ist, dass SQLite ein implizites DELETE FROM
ausführt Vorgang, bevor Sie den Tisch fallen lassen. Wenn der DELETE FROM
Der Vorgang führt zu einer Verletzung des Fremdschlüssels, dann erhalten wir den Fehler. Aber wenn es keine Daten in der Tabelle gibt, dann DELETE FROM
Der Vorgang führt nicht zu einer Verletzung des Fremdschlüssels, und die Tabelle kann gelöscht werden.
Kurz gesagt, es ist nicht die DROP TABLE
Operation, die Fremdschlüsselverletzungen verursacht, ist das implizite DELETE FROM
Betrieb.
Wenn der Fremdschlüssel ON DELETE CASCADE
verwendet
Wenn jedoch die Fremdschlüsseleinschränkung mit ON DELETE CASCADE
definiert ist , dann wird die übergeordnete Tabelle gelöscht und alle Zeilen, die auf die Primärschlüsselspalte dieser Tabelle verweisen, werden in der untergeordneten Tabelle gelöscht.
Hier ist ein Beispiel.
Tabellen erstellen und Daten einfügen:
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);
Daten auswählen:
sqlite> SELECT * FROM t11;
c1
--
1
sqlite> SELECT * FROM t12;
c1 c2
-- --
1 1
Löschen Sie die übergeordnete Tabelle und überprüfen Sie alle Tabellen:
sqlite> DROP TABLE t11;
sqlite> .tables
t12
Wir können das t11
sehen existiert nicht mehr, sondern t12
existiert noch.
Überprüfen Sie den Fremdschlüssel auf 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
Ja, das existiert noch, und wir können bestätigen, dass es ON DELETE CASCADE
hat .
Daten aus t12
auswählen :
sqlite> SELECT * FROM t12;
sqlite>
Es werden keine Zeilen zurückgegeben. Das liegt daran, dass ON DELETE CASCADE
Option auf dem Fremdschlüssel stellte sicher, dass die Zeile gelöscht wurde, wenn die übergeordnete Tabelle (t11
) gelöscht wurde (oder genauer gesagt, als seine Daten über das implizite DELETE FROM
gelöscht wurden). Vorgang vor dem Löschen).
Löschen eines Fremdschlüssels
SQLite unterstützt das Löschen von Fremdschlüsseln nicht wirklich. Normalerweise löscht man in SQL Fremdschlüssel mit dem ALTER TABLE
-Anweisung, sondern ALTER TABLE
von SQLite Die Implementierung erlaubt es nicht, Beschränkungen fallen zu lassen.
Es gibt jedoch einen Weg, mit dieser Situation umzugehen. Ein Beispiel finden Sie unter So löschen Sie einen Fremdschlüssel in SQLite.