Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi utiliser des clés étrangères sans action sur la suppression ou la mise à jour

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 comme user_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 comme file.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.