SQLite
 sql >> Datenbank >  >> RDS >> SQLite

SQLite DROP TABLE

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.