Table des matières

, ,

Erreur lors de la création d'une contrainte

Lors de la création d'une nouvelle contrainte entre deux tables ayant déjà des enregistrements l'erreur suivante peut se produire:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

La création de la contrainte échoue car il existe des enregistrements pour lesquels la valeur de la clé étrangère n'existe plus dans la table référencée.

Remarque: Pour créer des contraintes vérifier que les tables utilisent bien le moteur InnoDB.

Procédure

Plusieurs solution:

  1. désactiver la vérification des contraintes le temps de la requête de création de la nouvelle contrainte.
  2. Recherche les enregistrements provocant l'erreur.

Rechercher des enregistrements érronés

Dans l'exemple ci-dessous l'erreur se produit lors de la création d'une contrainte entre les tables famille et responsable:

ALTER TABLE famille ADD CONSTRAINT famille_id_resp1_responsable_id_resp FOREIGN KEY (id_resp1) REFERENCES responsable(id_resp) ON UPDATE CASCADE ON DELETE SET NULL;

Pour retrouver les enregistrements posant problème on utilise les mots clés NOT IN avec la syntaxe suivante:

SELECT * FROM famille WHERE id_resp1 NOT IN 
(SELECT id_resp FROM responsable);

Références