ORA-02292 « child record found » : causes et solutions

ORA-02292 « child record found » : impossible de supprimer un parent référencé par des enfants. Solutions (cascade, set null, soft delete) avec exemples.

Illustration de l'erreur Oracle ORA-02292

ORA-02292 « integrity constraint violated – child record found » survient quand vous tentez de supprimer (ou de modifier la clé d’)une ligne parent encore référencée par des lignes enfants via une clé étrangère. Exemple : supprimer un client qui a encore des commandes. Voici comment identifier les enfants et les bonnes stratégies de résolution.

Publicité

Le message

ORA-02292: integrity constraint (MONSCHEMA.FK_CMD_CLIENT) violated - child record found
ORA-02292: violation de contrainte d'intégrité - enregistrement fils existant

C’est l’inverse d’ORA-02291 : ici le parent existe, mais on ne peut pas le supprimer car des enfants en dépendent encore.

Étape 1 — Identifier la table enfant

-- la contrainte FK nommée pointe vers la table enfant
SELECT table_name AS table_enfant
FROM   user_constraints
WHERE  constraint_name = 'FK_CMD_CLIENT';

Ici, c’est COMMANDES qui référence CLIENTS.

Étape 2 — Lister les enfants concernés

SELECT * FROM commandes WHERE client_id = 4242;

Étape 3 — Choisir la stratégie

Solution 1 : supprimer les enfants d’abord

DELETE FROM commandes WHERE client_id = 4242;  -- enfants
DELETE FROM clients   WHERE id = 4242;         -- puis parent
COMMIT;

L’ordre est l’inverse de l’insertion : enfants puis parent.

Solution 2 : ON DELETE CASCADE (suppression automatique)

Si la suppression en cascade a un sens métier, définissez la clé étrangère avec ON DELETE CASCADE : supprimer le parent supprime alors ses enfants automatiquement.

ALTER TABLE commandes DROP CONSTRAINT fk_cmd_client;
ALTER TABLE commandes ADD CONSTRAINT fk_cmd_client
  FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE;

-- désormais :
DELETE FROM clients WHERE id = 4242;  -- supprime aussi ses commandes

⚠️ À manier avec prudence : une cascade mal placée peut effacer beaucoup plus que prévu.

Solution 3 : ON DELETE SET NULL (détacher l’enfant)

Si l’enfant peut survivre sans parent, la clé étrangère peut passer à NULL automatiquement (colonne enfant nullable) :

ALTER TABLE commandes ADD CONSTRAINT fk_cmd_client
  FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE SET NULL;

Solution 4 : ne pas supprimer, désactiver (soft delete)

Souvent la meilleure approche métier : marquer le parent comme inactif plutôt que de le supprimer.

UPDATE clients SET actif = 'N' WHERE id = 4242;

Cas particulier — TRUNCATE / DROP TABLE

Vider ou supprimer une table parent référencée échoue aussi. Pour TRUNCATE, traitez d’abord les enfants ; pour DROP, utilisez DROP TABLE clients CASCADE CONSTRAINTS (supprime les contraintes FK pointant vers elle, pas les données enfants).

Trouver toutes les dépendances d’une table

-- quelles tables référencent CLIENTS ?
SELECT c.table_name AS table_enfant, c.constraint_name
FROM   user_constraints c
JOIN   user_constraints p ON p.constraint_name = c.r_constraint_name
WHERE  p.table_name = 'CLIENTS' AND c.constraint_type = 'R';

FAQ

Quelle différence entre ORA-02291 et ORA-02292 ?

ORA-02291 : on insère un enfant sans parent. ORA-02292 : on supprime un parent qui a encore des enfants. Deux faces de la même clé étrangère.

ON DELETE CASCADE est-il dangereux ?

Il est puissant mais irréversible : il supprime en chaîne. Réservez-le aux relations où l’enfant n’a aucun sens sans le parent (ex. lignes de commande ↔ commande).

Comment supprimer un parent sans toucher aux enfants ?

Détachez-les (ON DELETE SET NULL ou UPDATE de la FK à NULL) si c’est valide, ou préférez un soft delete.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité