
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.
Le message
ORA-02292: integrity constraint (MONSCHEMA.FK_CMD_CLIENT) violated - child record found
ORA-02292: violation de contrainte d'intégrité - enregistrement fils existantC’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.
