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.