SQLite
 sql >> Base de données >  >> RDS >> SQLite

TABLEAU DROP SQLite

Dans SQLite, vous pouvez supprimer une table avec le DROP TABLE déclaration.

Vous pouvez éventuellement ajouter le IF EXISTS clause pour supprimer les erreurs qui pourraient se produire si la table n'existe pas.

De plus, si la table est référencée par une clé étrangère, il y a quelques points à prendre en compte.

Exemple

Voici un exemple pour montrer la manière la plus simple de supprimer une table dans SQLite :

DROP TABLE t1;

Cela supprime la table appelée t1 .

Vous pouvez éventuellement préfixer le nom de la table avec le nom du schéma.

Utiliser le IF EXISTS Article

Vous pouvez utiliser le IF EXISTS clause pour supprimer les erreurs qui pourraient se produire dans le cas où la table n'existe pas.

DROP TABLE IF EXISTS t2;

Si nous supprimons le IF EXISTS clause, et exécutez-la à nouveau, nous obtenons une erreur.

Exemple :

DROP TABLE t2;

Résultat :

Error: no such table: t2 

Dépendances de clé étrangère et de vue

SQLite ne supporte pas le CASCADE et RESTRICT mots-clés, qui sont inclus dans la norme SQL et sont pris en charge par d'autres SGBDR (tels que PostgreSQL). Ces mots clés sont conçus pour spécifier ce qu'il faut faire lorsque la table cible a des dépendances (telles qu'une vue ou une clé étrangère qui fait référence à la table).

Étant donné que SQLite ne prend pas en charge ces mots clés, voici comment SQLite traite les vues et les clés étrangères lorsque vous essayez de supprimer une table.

SQLite ignore toutes les vues dépendantes. En d'autres termes, il continue et supprime la table, même s'il existe une vue qui y fait référence.

Quant aux clés étrangères…

Premièrement, les clés étrangères sont désactivées par défaut dans SQLite. Ainsi, à moins que vous ne les activiez, toutes les clés étrangères faisant référence à la table cible n'auront aucun impact sur la suppression de la table cible. En d'autres termes, la table sera supprimée.

Si les clés étrangères sont activées dans votre session, elles n'empêcheront la suppression de la table que si des données violent cette clé étrangère. Si votre table enfant ne contient aucune donnée, la table parent sera supprimée sans erreur. Si la table enfant contient des données (incluant vraisemblablement des données faisant référence à la clé primaire de la table parent), cela entraînera une erreur et la table ne sera pas supprimée.

Comme ceci :

PRAGMA foreign_keys = ON;
DROP TABLE t1;

Résultat :

Error: FOREIGN KEY constraint failed 

La raison pour laquelle cela fonctionne comme ceci est que SQLite effectue un DELETE FROM implicite opération avant de déposer la table. Si le DELETE FROM l'opération entraîne une violation de clé étrangère, puis nous obtenons l'erreur. Mais s'il n'y a pas de données dans la table, alors tout DELETE FROM l'opération n'entraînera pas de violation de clé étrangère et la table peut être supprimée.

Bref, ce n'est pas le DROP TABLE opération qui provoque des violations de clé étrangère, c'est l'implicite DELETE FROM opération.

Lorsque la clé étrangère utilise ON DELETE CASCADE

Cependant, si la contrainte de clé étrangère est définie avec ON DELETE CASCADE , la table parent sera supprimée et toutes les lignes faisant référence à la colonne de clé primaire de cette table seront supprimées dans la table enfant.

Voici un exemple.

Créez des tableaux et insérez des données :

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);

Sélectionnez les données :

sqlite> SELECT * FROM t11;
c1
--
1 
sqlite> SELECT * FROM t12;
c1  c2
--  --
1   1 

Supprimez la table parent et passez en revue toutes les tables :

sqlite> DROP TABLE t11;
sqlite> .tables
t12

Nous pouvons voir que t11 n'existe plus, mais t12 existe toujours.

Vérifier la clé étrangère sur 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 

Oui, cela existe toujours, et nous pouvons confirmer qu'il a ON DELETE CASCADE .

Sélectionnez les données de t12 :

sqlite> SELECT * FROM t12;
sqlite> 

Aucune ligne n'est renvoyée. C'est parce que le ON DELETE CASCADE l'option sur la clé étrangère garantissait que la ligne était supprimée lorsque la table parent (t11 ) a été supprimé (ou plus précisément, lorsque ses données ont été supprimées via l'implicite DELETE FROM opération avant d'être supprimée).

Déposer une clé étrangère

SQLite ne prend pas en charge la suppression de clés étrangères. Normalement, en SQL, vous supprimez les clés étrangères avec le ALTER TABLE instruction, mais ALTER TABLE de SQLite l'implémentation ne permet pas de supprimer les contraintes.

Il existe cependant un moyen de gérer cette situation. Voir Comment supprimer une clé étrangère dans SQLite pour un exemple.