Je pense que vous ne comprenez pas ce que signifie ON DELETE NO ACTION
moyens. Ce n'est pas signifie supprimer la contrainte de clé étrangère.
Lorsque vous supprimez un enregistrement référencé par une clé étrangère, InnoDB a la capacité de prendre une action automatique pour rectifier la situation :
- il peut
CASCADE
, c'est-à-dire supprimer l'enregistrement de référence. (Cela aurait du sens pour quelque chose commeuser_address.user_id
. Si vous supprimez définitivement un utilisateur, vous souhaiterez probablement également supprimer définitivement toutes les adresses de l'utilisateur.) - il peut
SET NULL
, c'est-à-dire effacer la clé de référence. (Cela peut avoir du sens pour quelque chose commefile.last_modified_by
. Si vous supprimez définitivement un utilisateur, vous souhaiterez peut-être que la dernière modification du fichier par devienne simplement "inconnue".)
Si vous spécifiez NO ACTION
, vous dites à InnoDB que vous ne voulez pas qu'il entreprenne l'une ou l'autre de ces actions. InnoDB ne peut donc pas régler la situation pour vous ; tout ce qu'il peut faire est de rejeter le DELETE
et renvoie une erreur.
Par conséquent, ON DELETE NO ACTION
est en fait le même que ON DELETE RESTRICT
(valeur par défaut).
(Remarque :dans certains SGBD et en SQL standard, ON DELETE NO ACTION
est un peu différent de ON DELETE RESTRICT
:dans ceux-ci, ON DELETE NO ACTION
signifie "accepter le DELETE
dans la transaction en cours, mais rejette toute la transaction si j'essaie de la valider avant de corriger le problème". Mais InnoDB ne prend pas en charge les vérifications différées, il traite donc ON DELETE NO ACTION
exactement la même chose que ON DELETE RESTRICT
, et rejette toujours le DELETE
immédiatement .)
Voir §§14.2.2.5 "CLÉ ÉTRANGÈRE Contraintes" et 13.1.17.2 "Utilisation des contraintes FOREIGN KEY " dans le manuel de référence de MySQL 5.6.