SQL DROP

Par :

,le

La commande DROP TABLE supprime définitivement une table de la base de données, avec toutes ses données, ses index et ses contraintes associées. Elle fait partie du langage de définition de données (DDL), au même titre que CREATE TABLE ou ALTER TABLE. C’est une opération irréversible : une fois exécutée, la table ne peut être récupérée que depuis une sauvegarde.

Syntaxe de base

Avant d’exécuter DROP TABLE, il est recommandé d’utiliser la variante IF EXISTS pour éviter une erreur si la table n’existe pas encore — ce qui arrive fréquemment dans les scripts de migration exécutés plusieurs fois.

-- Suppression simple
DROP TABLE nom_table;

-- Suppression sans erreur si la table est absente
DROP TABLE IF EXISTS nom_table;

-- Suppression de plusieurs tables en une instruction
DROP TABLE IF EXISTS table1, table2;

-- Suppression avec propagation aux dépendances (PostgreSQL)
DROP TABLE IF EXISTS logs CASCADE;

Sans IF EXISTS, le moteur retourne une erreur si la table n’existe pas. Avec CASCADE (PostgreSQL), les vues et clés étrangères qui dépendent de la table sont supprimées automatiquement.

Effets concrets sur la base

DROP TABLE ne se contente pas de vider les lignes : elle supprime l’objet entier du catalogue système. Pour bien comprendre la différence avec DELETE ou TRUNCATE, voici ce qu’il se passe sur une table logs avant et après l’exécution.

Avant DROP TABLE logs;, la table contient des données et est accessible normalement :

idniveaudetailstimestamp
1INFOSession ouverte2026-01-22 10:30:00
2ERRORÉchec authentification2026-01-22 11:15:00
3WARNINGTimeout requête2026-01-22 14:45:00

Après DROP TABLE logs;, la table n’existe plus dans le schéma. Toute requête sur cet objet retourne une erreur.

-- Cette requête échoue après DROP TABLE
SELECT * FROM logs;
-- Erreur : relation "logs" n'existe pas

Pour accéder à nouveau à ces données, il faut recréer la table avec CREATE TABLE et réimporter les données depuis une sauvegarde.

DROP TABLE vs DELETE vs TRUNCATE

Ces trois commandes suppriment des données, mais leurs effets sont fondamentalement différents. DROP TABLE efface la table entière, sa structure et tout ce qui y est attaché. TRUNCATE vide les données mais conserve la structure alors que DELETE supprime les lignes une par une et supporte une clause WHERE.

DROP TABLE commandes;      -- Supprime données + structure + index + contraintes
TRUNCATE TABLE commandes;  -- Supprime toutes les données, conserve la structure
DELETE FROM commandes;     -- Supprime toutes les données ligne par ligne
DELETE FROM commandes WHERE statut = 'annulée';  -- Suppression sélective
CommandeDonnéesStructureAuto-incrémentSupport de WHERECatégorie
DROP TABLE✅ Supprimées❌ SuppriméeN/A❌ NonDDL
TRUNCATE✅ Supprimées✅ Conservée✅ Réinitialisé❌ NonDDL
DELETE✅ Supprimées✅ Conservée❌ Non modifié✅ OuiDML

Fonctionnement interne

Quand DROP TABLE est exécutée, le moteur ne parcourt pas les lignes une par une. Il marque directement l’entrée de la table dans le catalogue système comme supprimée, puis libère les blocs de stockage alloués (extents) en une seule opération. C’est pourquoi la commande s’exécute en quelques millisecondes quelle que soit la taille de la table.

Le journal des transactions enregistre la modification du schéma pour garantir la cohérence en cas de panne. Si des objets dépendent de la table (vues, clés étrangères), le moteur bloque l’opération et retourne une erreur explicite — sauf si CASCADE est utilisé.

Exemples en fonction du SGBD

PostgreSQL

PostgreSQL est le SGBD qui offre le contrôle le plus fin sur DROP TABLE, notamment via CASCADE pour gérer les dépendances. Pour tester une suppression sans risque, il est possible d’utiliser une transaction et d’annuler avec ROLLBACK.

-- Test sécurisé dans une transaction
BEGIN;
DROP TABLE IF EXISTS commandes_archive;
-- Vérifier que tout est correct avant de valider
ROLLBACK;  -- Annule le DROP si besoin
-- ou COMMIT; pour valider définitivement

Quand des vues ou des clés étrangères référencent la table cible, CASCADE propage la suppression à tous les objets dépendants. Sans CASCADE, PostgreSQL retourne une erreur détaillant chaque dépendance bloquante.

-- Sans CASCADE : erreur si des dépendances existent
DROP TABLE clients;
-- Erreur : la table "commandes" a une clé étrangère vers "clients"

-- Avec CASCADE : supprime clients + toutes les dépendances
DROP TABLE clients CASCADE;

MySQL

MySQL vérifie les contraintes de clés étrangères avant d’autoriser la suppression. Si une autre table référence la table cible, le moteur bloque l’opération. Il faut désactiver les vérifications temporairement, exécuter le DROP, puis les réactiver.

-- Désactiver les vérifications de clés étrangères
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS logs;
SET FOREIGN_KEY_CHECKS = 1;

MySQL ne supporte pas la commande CASCADE dans DROP TABLE comme PostgreSQL — la désactivation des vérifications est la seule méthode disponible.

SQL Server

SQL Server exige que les contraintes de clés étrangères soient supprimées manuellement avant de pouvoir supprimer la table cible. La procédure standard consiste à supprimer d’abord la contrainte, puis la table.

-- Supprimer la contrainte de clé étrangère avant DROP TABLE
ALTER TABLE commandes DROP CONSTRAINT fk_client_id;

-- Puis supprimer la table
DROP TABLE IF EXISTS clients;

Bonnes pratiques en production

Avant toute suppression de table en production, identifier les objets qui dépendent de la table évite les interruptions de service. Cette requête liste les dépendances dans les SGBD compatibles avec information_schema.

-- Identifier les tables qui référencent la table cible
SELECT table_name, constraint_name
FROM information_schema.referential_constraints
WHERE referenced_table_name = 'nom_table';

Si le contenu de la table peut être utile ultérieurement, créer une sauvegarde avant la suppression prend peu de temps et peut éviter une restauration complète depuis un backup.

-- Sauvegarde des données avant DROP
CREATE TABLE logs_backup_2026 AS SELECT * FROM logs;

-- Puis suppression définitive
DROP TABLE logs;

Intégrer la suppression d'une table dans un script de migration versionné (avec Flyway ou Liquibase par exemple) garantit la traçabilité et la réversibilité de chaque modification de schéma.

Erreurs courantes

-- ❌ DROP TABLE sans IF EXISTS dans un script exécuté plusieurs fois
DROP TABLE logs;
-- Erreur à la deuxième exécution : la table n'existe plus

-- ✅ Toujours utiliser IF EXISTS dans les scripts
DROP TABLE IF EXISTS logs;
-- ❌ DROP TABLE bloqué par une dépendance (PostgreSQL / SQL Server)
DROP TABLE clients;
-- Erreur : des objets dépendent de cette table

-- ✅ PostgreSQL : CASCADE pour propager la suppression
DROP TABLE clients CASCADE;

-- ✅ SQL Server : supprimer la contrainte d'abord
ALTER TABLE commandes DROP CONSTRAINT fk_client_id;
DROP TABLE clients;
-- ❌ Confondre DROP TABLE et DELETE pour vider une table
DROP TABLE logs;  -- Détruit la structure, impossible d'y réinsérer sans recréer

-- ✅ Pour vider sans détruire la structure
TRUNCATE TABLE logs;

Sources: Postgresql, SQL Server