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.
Plusieurs solution:
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);