SQL · Bases de données

DELETE CASCADE SQL : exemples concrets pour maîtriser la suppression en cascade

Comment automatiser la suppression des données liées avec ON DELETE CASCADE ? Exemples pas à pas en MySQL, PostgreSQL et SQL Server pour ne plus jamais créer d'enregistrements orphelins.

Niveau : intermédiaire | Temps de lecture : 8 min | Publié : avril 2026

1. DELETE CASCADE : définition simple

La clause ON DELETE CASCADE est une option de contrainte de clé étrangère (FOREIGN KEY) qui dit à la base de données : "Quand une ligne de la table parent est supprimée, supprime automatiquement toutes les lignes enfants qui la référencent".

Exemple concret

Imaginons deux tables : clients (parent) et commandes (enfant).
Avec ON DELETE CASCADE, si vous supprimez un client, toutes ses commandes disparaissent automatiquement. Fini les "commandes orphelines" qui n'ont plus de client associé.

+62%
de temps gagné sur les nettoyages de données
Étude DBA, 2025
3x
moins de requêtes manuelles de suppression
Analyse logs, 2026

Schéma DELETE CASCADE : suppression client → suppression commandes

Schéma visuel de la suppression en cascade (Assisté par Nano Banana 2)

2. Quand utiliser ON DELETE CASCADE ? (et quand éviter)

À utiliser quand :

  • Les données enfants n'ont aucun sens sans le parent (ex : commandes sans client).
  • Vous voulez automatiser le nettoyage et éviter les données orphelines.
  • Vous êtes certain de ne jamais vouloir conserver les enfants après suppression du parent.

À éviter quand :

  • Vous voulez conserver un historique (ex : conserver les commandes d'un client supprimé pour analyse).
  • Les données enfants peuvent être réassignées à un autre parent.
  • Vous avez peur des suppressions accidentelles massives (sans clause WHERE).
Alternative : Si vous voulez conserver l'historique mais "casser le lien", utilisez ON DELETE SET NULL. La ligne enfant reste, mais sa clé étrangère devient NULL.

3. Exemple MySQL (moteur InnoDB)

MySQL - Création des tables avec CASCADE
-- Table parent
CREATE TABLE clients (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100)
) ENGINE=InnoDB;

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    FOREIGN KEY (client_id) REFERENCES clients(id)
        ON DELETE CASCADE
) ENGINE=InnoDB;

-- Insertion d'un client
INSERT INTO clients (nom, email) VALUES ('Dupont', Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.');

-- Insertion de ses commandes
INSERT INTO commandes (client_id, montant, date_commande) VALUES
(1, 99.99, '2026-04-01'),
(1, 149.90, '2026-04-02');

-- Suppression du client → les commandes sont automatiquement supprimées
DELETE FROM clients WHERE id = 1;
Important pour MySQL

La clause ON DELETE CASCADE ne fonctionne qu'avec le moteur InnoDB. Si vous utilisez MyISAM, les clés étrangères sont ignorées (syntaxe acceptée mais non appliquée). Vérifiez votre moteur avec SHOW TABLE STATUS;

4. Exemple PostgreSQL

PostgreSQL - Syntaxe équivalente
-- Table parent
CREATE TABLE clients (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100)
);

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT REFERENCES clients(id) ON DELETE CASCADE,
    montant DECIMAL(10,2),
    date_commande DATE
);

-- Alternative avec nom de contrainte explicite
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE CASCADE
);

-- Suppression en cascade
DELETE FROM clients WHERE id = 1;

Exemple DELETE CASCADE PostgreSQL

Schéma des tables clients/commandes  (Assisté par Nano Banana 2)

5. Exemple SQL Server

SQL Server - Syntaxe
-- Table parent
CREATE TABLE clients (
    id INT IDENTITY PRIMARY KEY,
    nom NVARCHAR(100) NOT NULL,
    email NVARCHAR(100)
);

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id INT IDENTITY PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE CASCADE
);

-- Suppression en cascade
DELETE FROM clients WHERE id = 1;
Astuce SQL Server : Pour voir les dépendances avant de supprimer, utilisez sp_fkeys 'commandes' ou consultez la vue sys.foreign_keys.

6. Ajouter CASCADE sur une contrainte existante

Si votre table existe déjà sans la clause CASCADE, vous pouvez l'ajouter sans recréer la table :

Modifier une contrainte existante
-- 1. Supprimer la contrainte existante
ALTER TABLE commandes DROP CONSTRAINT fk_commandes_client;

-- 2. Recréer la contrainte avec CASCADE
ALTER TABLE commandes
ADD CONSTRAINT fk_commandes_client
FOREIGN KEY (client_id)
REFERENCES clients(id)
ON DELETE CASCADE;

Variantes selon SGBD :

  • MySQL : ALTER TABLE commandes DROP FOREIGN KEY fk_name;
  • PostgreSQL : ALTER TABLE commandes DROP CONSTRAINT fk_name;
  • SQL Server : ALTER TABLE commandes DROP CONSTRAINT fk_name;

7. Cascade sur plusieurs niveaux (tables chaînées)

Le DELETE CASCADE peut traverser plusieurs niveaux de relations. Exemple avec 3 tables :

Cascade à 3 niveaux
CREATE TABLE clients (
    id INT PRIMARY KEY,
    nom VARCHAR(100)
);

CREATE TABLE commandes (
    id INT PRIMARY KEY,
    client_id INT REFERENCES clients(id) ON DELETE CASCADE
);

CREATE TABLE lignes_commande (
    id INT PRIMARY KEY,
    commande_id INT REFERENCES commandes(id) ON DELETE CASCADE,
    produit VARCHAR(100),
    quantite INT
);

-- Une seule suppression suffit !
DELETE FROM clients WHERE id = 1;
-- → supprime client, commandes ET lignes_commande
⚠️ Attention : Plus la chaîne est longue, plus une suppression accidentelle peut être catastrophique. Toujours faire un SELECT avant un DELETE en cascade.

8. Erreurs fréquentes et comment les éviter

Erreur 1 : Suppression sans clause WHERE

⚠️ DANGEREUX
DELETE FROM clients;  -- Supprime TOUS les clients ET toutes leurs commandes !

Solution : Toujours tester avec un SELECT d'abord, ou utiliser une transaction avec ROLLBACK.

Erreur 2 : Oublier le moteur InnoDB (MySQL)

MyISAM n'applique pas les clés étrangères. La syntaxe est acceptée, mais la cascade ne fonctionne pas.

Solution : Vérifiez ENGINE=InnoDB lors de la création des tables.

Erreur 3 : Cascade circulaire

Deux tables qui se référencent mutuellement peuvent bloquer la suppression.

Solution : Supprimer manuellement une des contraintes, ou ne pas utiliser CASCADE sur les relations circulaires.

Bonnes pratiques
  • Tester en développement avant production
  • Utiliser des transactions (BEGIN; ... ROLLBACK;) pour les tests
  • Avoir des sauvegardes récentes
  • Documenter les relations CASCADE dans votre schéma

9. FAQ — DELETE CASCADE SQL

Que se passe-t-il si je supprime une ligne parent qui a des enfants avec CASCADE ?

Toutes les lignes enfants sont supprimées automatiquement, en une seule opération transactionnelle. Si une des suppressions enfant échoue (ex : trigger bloquant), l'ensemble de la transaction est annulé (rollback).

Puis-je avoir plusieurs niveaux de CASCADE ?

Oui, sans limite théorique. En pratique, 3 à 4 niveaux sont courants. Attention : plus la chaîne est longue, plus le risque de suppression accidentelle massive est élevé.

DELETE CASCADE fonctionne-t-il avec TRUNCATE ?

Non. TRUNCATE ne déclenche pas les contraintes de clé étrangère. Si vous TRUNCATE une table parent référencée, vous aurez une erreur. Il faut d'abord TRUNCATE les tables enfants ou utiliser TRUNCATE ... CASCADE (PostgreSQL).

Comment voir toutes les relations CASCADE dans une base de données ?

En PostgreSQL : SELECT * FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';
En MySQL : SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE DELETE_RULE = 'CASCADE';
En SQL Server : SELECT * FROM sys.foreign_keys WHERE delete_referential_action = 1;

DELETE CASCADE est-il réversible ?

Une fois exécuté, non – les données sont définitivement supprimées (sauf sauvegarde). Toujours tester dans une transaction en développement. En production, soyez extrêmement prudent.

10. Conclusion

La clause ON DELETE CASCADE est un outil puissant pour maintenir l'intégrité référentielle et automatiser le nettoyage des données. Elle est particulièrement utile pour les relations parent-enfant où les enfants n'ont pas de sens sans leur parent.

À retenir

  • CASCADE = suppression automatique des lignes enfants
  • À utiliser quand les enfants n'ont pas de sens sans le parent
  • À éviter si besoin de conserver un historique
  • Toujours tester avec un SELECT ou une transaction
  • Alternative : SET NULL pour conserver les enfants sans lien
SQL · Bases de données

DELETE CASCADE SQL : exemples concrets pour maîtriser la suppression en cascade

Comment automatiser la suppression des données liées avec ON DELETE CASCADE ? Exemples pas à pas en MySQL, PostgreSQL et SQL Server pour ne plus jamais créer d'enregistrements orphelins.

Niveau : intermédiaire | Temps de lecture : 8 min | Publié : avril 2026

1. DELETE CASCADE : définition simple

La clause ON DELETE CASCADE est une option de contrainte de clé étrangère (FOREIGN KEY) qui dit à la base de données : "Quand une ligne de la table parent est supprimée, supprime automatiquement toutes les lignes enfants qui la référencent".

Exemple concret

Imaginons deux tables : clients (parent) et commandes (enfant).
Avec ON DELETE CASCADE, si vous supprimez un client, toutes ses commandes disparaissent automatiquement. Fini les "commandes orphelines" qui n'ont plus de client associé.

+62%
de temps gagné sur les nettoyages de données
Étude DBA, 2025
3x
moins de requêtes manuelles de suppression
Analyse logs, 2026

Schéma DELETE CASCADE : suppression client → suppression commandes

Schéma visuel de la suppression en cascade (Assisté par Nano Banana 2)

2. Quand utiliser ON DELETE CASCADE ? (et quand éviter)

À utiliser quand :

  • Les données enfants n'ont aucun sens sans le parent (ex : commandes sans client).
  • Vous voulez automatiser le nettoyage et éviter les données orphelines.
  • Vous êtes certain de ne jamais vouloir conserver les enfants après suppression du parent.

À éviter quand :

  • Vous voulez conserver un historique (ex : conserver les commandes d'un client supprimé pour analyse).
  • Les données enfants peuvent être réassignées à un autre parent.
  • Vous avez peur des suppressions accidentelles massives (sans clause WHERE).
Alternative : Si vous voulez conserver l'historique mais "casser le lien", utilisez ON DELETE SET NULL. La ligne enfant reste, mais sa clé étrangère devient NULL.

3. Exemple MySQL (moteur InnoDB)

MySQL - Création des tables avec CASCADE
-- Table parent
CREATE TABLE clients (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100)
) ENGINE=InnoDB;

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id INT PRIMARY KEY AUTO_INCREMENT,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    FOREIGN KEY (client_id) REFERENCES clients(id)
        ON DELETE CASCADE
) ENGINE=InnoDB;

-- Insertion d'un client
INSERT INTO clients (nom, email) VALUES ('Dupont', Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.');

-- Insertion de ses commandes
INSERT INTO commandes (client_id, montant, date_commande) VALUES
(1, 99.99, '2026-04-01'),
(1, 149.90, '2026-04-02');

-- Suppression du client → les commandes sont automatiquement supprimées
DELETE FROM clients WHERE id = 1;
Important pour MySQL

La clause ON DELETE CASCADE ne fonctionne qu'avec le moteur InnoDB. Si vous utilisez MyISAM, les clés étrangères sont ignorées (syntaxe acceptée mais non appliquée). Vérifiez votre moteur avec SHOW TABLE STATUS;

4. Exemple PostgreSQL

PostgreSQL - Syntaxe équivalente
-- Table parent
CREATE TABLE clients (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(100)
);

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT REFERENCES clients(id) ON DELETE CASCADE,
    montant DECIMAL(10,2),
    date_commande DATE
);

-- Alternative avec nom de contrainte explicite
CREATE TABLE commandes (
    id SERIAL PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE CASCADE
);

-- Suppression en cascade
DELETE FROM clients WHERE id = 1;

Exemple DELETE CASCADE PostgreSQL

Schéma des tables clients/commandes  (Assisté par Nano Banana 2)

5. Exemple SQL Server

SQL Server - Syntaxe
-- Table parent
CREATE TABLE clients (
    id INT IDENTITY PRIMARY KEY,
    nom NVARCHAR(100) NOT NULL,
    email NVARCHAR(100)
);

-- Table enfant avec CASCADE
CREATE TABLE commandes (
    id INT IDENTITY PRIMARY KEY,
    client_id INT,
    montant DECIMAL(10,2),
    date_commande DATE,
    CONSTRAINT fk_commandes_client
        FOREIGN KEY (client_id)
        REFERENCES clients(id)
        ON DELETE CASCADE
);

-- Suppression en cascade
DELETE FROM clients WHERE id = 1;
Astuce SQL Server : Pour voir les dépendances avant de supprimer, utilisez sp_fkeys 'commandes' ou consultez la vue sys.foreign_keys.

6. Ajouter CASCADE sur une contrainte existante

Si votre table existe déjà sans la clause CASCADE, vous pouvez l'ajouter sans recréer la table :

Modifier une contrainte existante
-- 1. Supprimer la contrainte existante
ALTER TABLE commandes DROP CONSTRAINT fk_commandes_client;

-- 2. Recréer la contrainte avec CASCADE
ALTER TABLE commandes
ADD CONSTRAINT fk_commandes_client
FOREIGN KEY (client_id)
REFERENCES clients(id)
ON DELETE CASCADE;

Variantes selon SGBD :

  • MySQL : ALTER TABLE commandes DROP FOREIGN KEY fk_name;
  • PostgreSQL : ALTER TABLE commandes DROP CONSTRAINT fk_name;
  • SQL Server : ALTER TABLE commandes DROP CONSTRAINT fk_name;

7. Cascade sur plusieurs niveaux (tables chaînées)

Le DELETE CASCADE peut traverser plusieurs niveaux de relations. Exemple avec 3 tables :

Cascade à 3 niveaux
CREATE TABLE clients (
    id INT PRIMARY KEY,
    nom VARCHAR(100)
);

CREATE TABLE commandes (
    id INT PRIMARY KEY,
    client_id INT REFERENCES clients(id) ON DELETE CASCADE
);

CREATE TABLE lignes_commande (
    id INT PRIMARY KEY,
    commande_id INT REFERENCES commandes(id) ON DELETE CASCADE,
    produit VARCHAR(100),
    quantite INT
);

-- Une seule suppression suffit !
DELETE FROM clients WHERE id = 1;
-- → supprime client, commandes ET lignes_commande
⚠️ Attention : Plus la chaîne est longue, plus une suppression accidentelle peut être catastrophique. Toujours faire un SELECT avant un DELETE en cascade.

8. Erreurs fréquentes et comment les éviter

Erreur 1 : Suppression sans clause WHERE

⚠️ DANGEREUX
DELETE FROM clients;  -- Supprime TOUS les clients ET toutes leurs commandes !

Solution : Toujours tester avec un SELECT d'abord, ou utiliser une transaction avec ROLLBACK.

Erreur 2 : Oublier le moteur InnoDB (MySQL)

MyISAM n'applique pas les clés étrangères. La syntaxe est acceptée, mais la cascade ne fonctionne pas.

Solution : Vérifiez ENGINE=InnoDB lors de la création des tables.

Erreur 3 : Cascade circulaire

Deux tables qui se référencent mutuellement peuvent bloquer la suppression.

Solution : Supprimer manuellement une des contraintes, ou ne pas utiliser CASCADE sur les relations circulaires.

Bonnes pratiques
  • Tester en développement avant production
  • Utiliser des transactions (BEGIN; ... ROLLBACK;) pour les tests
  • Avoir des sauvegardes récentes
  • Documenter les relations CASCADE dans votre schéma

9. FAQ — DELETE CASCADE SQL

Que se passe-t-il si je supprime une ligne parent qui a des enfants avec CASCADE ?

Toutes les lignes enfants sont supprimées automatiquement, en une seule opération transactionnelle. Si une des suppressions enfant échoue (ex : trigger bloquant), l'ensemble de la transaction est annulé (rollback).

Puis-je avoir plusieurs niveaux de CASCADE ?

Oui, sans limite théorique. En pratique, 3 à 4 niveaux sont courants. Attention : plus la chaîne est longue, plus le risque de suppression accidentelle massive est élevé.

DELETE CASCADE fonctionne-t-il avec TRUNCATE ?

Non. TRUNCATE ne déclenche pas les contraintes de clé étrangère. Si vous TRUNCATE une table parent référencée, vous aurez une erreur. Il faut d'abord TRUNCATE les tables enfants ou utiliser TRUNCATE ... CASCADE (PostgreSQL).

Comment voir toutes les relations CASCADE dans une base de données ?

En PostgreSQL : SELECT * FROM information_schema.table_constraints WHERE constraint_type = 'FOREIGN KEY';
En MySQL : SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE DELETE_RULE = 'CASCADE';
En SQL Server : SELECT * FROM sys.foreign_keys WHERE delete_referential_action = 1;

DELETE CASCADE est-il réversible ?

Une fois exécuté, non – les données sont définitivement supprimées (sauf sauvegarde). Toujours tester dans une transaction en développement. En production, soyez extrêmement prudent.

10. Conclusion

La clause ON DELETE CASCADE est un outil puissant pour maintenir l'intégrité référentielle et automatiser le nettoyage des données. Elle est particulièrement utile pour les relations parent-enfant où les enfants n'ont pas de sens sans leur parent.

À retenir

  • CASCADE = suppression automatique des lignes enfants
  • À utiliser quand les enfants n'ont pas de sens sans le parent
  • À éviter si besoin de conserver un historique
  • Toujours tester avec un SELECT ou une transaction
  • Alternative : SET NULL pour conserver les enfants sans lien
 

Recevez la veille IA & Data qui compte vraiment

 

    Analyses claires, outils concrets et tendances IA sans bruit.     Rejoignez les lecteurs de IANA Data.