En SQL, si vous souhaitez supprimer une table d'une base de données, vous devez utiliser le DROP TABLE
déclaration.
Cela détruit la table et toutes ses données.
Syntaxe
La syntaxe standard SQL ressemble à ceci :
DROP TABLE <table name> <drop behavior>
Où :
<table name>
est le nom de la table que vous souhaitez supprimer.<drop behavior>
spécifie toutes les options. Ceux-ci peuvent être soitCASCADE
ouRESTRICT
.
Certains SGBDR acceptent également un IF EXISTS
facultatif argument qui signifie qu'il ne renverra pas d'erreur si la table n'existe pas.
Certains SGBDR (tels que MySQL et MariaDB) acceptent également un TEMPORARY
facultatif mot-clé pour s'assurer que seules les tables temporaires sont supprimées.
Oracle accepte également une PURGE
clause, qui le purge de la corbeille.
Exemple
Voici un exemple pour illustrer.
DROP TABLE t1;
L'exécution de ce code supprime la table appelée t1
et toutes ses données.
Le IF EXISTS
Article
Voici un exemple d'utilisation de IF EXISTS
clause pour vérifier si la table existe déjà.
DROP TABLE IF EXISTS t1;
Utilisation de IF EXISTS
garantit que nous n'obtenons pas d'erreur si la table n'existe pas.
Voici ce qui se passe si nous supprimons IF EXISTS
de la déclaration :
DROP TABLE t1;
Résultat :
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
C'est le message renvoyé par SQL Server. Votre message dépendra du SGBD que vous utilisez.
Clés et vues étrangères dépendantes
Certains SGBDR autorisent un RESTRICT
facultatif ou CASCADE
mot-clé qui spécifie ce qui se passe si la table a des clés étrangères ou des vues qui y font référence.
Le RESTRICT
Options
Voici un exemple d'utilisation de RESTRICT
lors d'une tentative de suppression d'une table référencée par une clé étrangère dans une autre table :
DROP TABLE t1 RESTRICT;
Résultat :
cannot drop table t1 because other objects depend on it
Cet exemple a été réalisé avec PostgreSQL. RESTRICT
est l'option par défaut, donc nous aurions reçu le même résultat même si nous n'avions pas inclus le RESTRICT
mot-clé.
La CASCADE
Options
Voici ce qui se passe si nous passons à CASCADE
lors d'une tentative de suppression de la même table (qui est référencée par une clé étrangère dans une autre table) :
DROP TABLE t1 CASCADE;
Résultat :
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Cela a supprimé la clé étrangère qui faisait référence à notre t1
table. La clé étrangère s'appelait t2_c2_fkey
.
Notez qu'il n'a pas supprimé la table contenant la clé étrangère. Il n'a supprimé que la clé étrangère.
Si la table cible (t1
) était référencé par n'importe quelle vue, la vue entière aurait été supprimée.
Vous n'avez pas besoin de spécifier CASCADE
pour supprimer tous les index, règles, déclencheurs ou contraintes qui existent pour la table cible. Ceux-ci sont supprimés automatiquement, même en utilisant l'option par défaut (RESTRICT
).
MySQL et MariaDB
Certains SGBD (tels que MySQL et MariaDB) acceptent le RESTRICT
et CASCADE
mots-clés, mais ils ne font rien. Ils sont fournis simplement pour faciliter la portabilité entre les SGBD.
Oracle
Oracle a une syntaxe légèrement différente, CASCADE CONSTRAINTS
, qui supprime toutes les contraintes d'intégrité référentielle faisant référence aux clés primaires et uniques dans la table supprimée.
SQL Server
SQL Server ne prend pas en charge la CASCADE
ou RESTRICT
mots clés. Si la table a des dépendances de clé étrangère, vous devrez les supprimer avant de supprimer la table, sinon vous obtiendrez une erreur.
Cependant, dans SQL Server, vous pouvez supprimer une table même si elle est référencée par une vue ou une procédure stockée. Par conséquent, vous devez rechercher de telles références et les supprimer explicitement en utilisant DROP VIEW
ou DROP PROCEDURE
.
SQLite
SQLite ne supporte pas le CASCADE
ou RESTRICT
mots clés.
Si la table cible est référencée par des vues, la table sera toujours supprimée (et la vue restera).
Si la table cible est référencée par des clés étrangères, le résultat dépendra si vous avez des clés étrangères activées, et si oui, s'il y a des données dans la table enfant, et si oui, si oui ou non la clé étrangère est définie avec ON DELETE CASCADE
.
Si vous utilisez SQLite, voir SQLite DROP TABLE
pour un exemple et une discussion sur la suppression d'une table référencée par une clé étrangère.
Supprimer plusieurs tableaux
Certains SGBDR vous permettent de supprimer plusieurs tables d'un seul DROP TABLE
déclaration.
Exemple :
DROP TABLE t11, t12;
Les SGBDR qui prennent en charge cette syntaxe incluent SQL Server, MySQL, MariaDB et PostgreSQL.
Cependant, si vous supprimez une table référencée par une clé étrangère et que cette clé étrangère l'empêche d'être supprimée, vous devrez répertorier la table enfant avant la table parent.
Par exemple, si j'exécute l'instruction ci-dessus dans SQL Server, j'obtiens l'erreur suivante :
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
Dans ce cas, je peux simplement changer l'ordre des tables dans mon DROP TABLE
déclaration :
DROP TABLE t12, t11;
En fait, dans ce cas, j'ai eu une autre erreur me disant que t12
n'existe pas.
Voici ce que j'ai :
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
En effet, même si l'instruction précédente ne pouvait pas supprimer t11
, il a en fait réussi à supprimer t12
.
Et tout comme une comédie d'erreurs, cette fois, il a réussi à laisser tomber t11
mais pas t12
.
Quoi qu'il en soit, les deux tables ont maintenant été supprimées.
Mais si vous obtenez la commande correcte la première fois, vous devriez recevoir un message comme celui-ci :
Commands completed successfully.
Le mot-clé TEMPORAIRE
Certains SGBDR (tels que MySQL et MariaDB) acceptent un TEMPORARY
mot-clé.
Il va entre DROP
et TABLE
, comme ceci :
DROP TEMPORARY TABLE t1;
Utilisation du TEMPORARY
mot-clé garantira que vous ne supprimez pas accidentellement une table non temporaire lorsque vous tentez de supprimer une table temporaire.
Le TEMPORARY
mot-clé a les effets suivants :
- L'instruction supprime uniquement
TEMPORARY
tableaux. - L'instruction ne provoque pas de commit implicite (en utilisant
DROP TABLE
sans leTEMPORARY
mot-clé valide automatiquement la transaction active en cours). - Aucun droit d'accès n'est vérifié. Un
TEMPORARY
la table n'est visible qu'avec la session qui l'a créée, aucune vérification n'est donc nécessaire.
La clause de purge
Oracle a un PURGE
facultatif clause, que vous pouvez utiliser si vous souhaitez supprimer la table et libérer l'espace qui lui est associé en une seule étape. Si vous spécifiez PURGE
, la base de données ne place pas la table et ses objets dépendants dans la corbeille.
Cela équivaut à supprimer d'abord la table, puis à la purger de la corbeille, mais cela vous permet d'économiser une étape du processus.
Notez que si vous spécifiez PURGE
, vous ne pourrez pas récupérer la table.
Si vous ne spécifiez pas PURGE
, le DROP
TABLE
n'entraîne pas la libération d'espace vers le tablespace pour être utilisé par d'autres objets, et l'espace continue d'être comptabilisé dans le quota d'espace de l'utilisateur.