Pourquoi utiliser les clés étrangères avec aucune action sur la suppression ou mise à jour
J'ai une question d'intérêt:
J'ai 2 tables en mysql avec InnoDb
.
tableau tbl_a
possède une clé primaire nommée a_id
;
tableau tbl_b
a un premier b_id
et une clé étrangère sur tbl_a.a_id
avec "ON DELETE NO ACTION
".
+-------------+---------------+---------------+
| Table Name | Primary Key | Foreign Key |
+-------------+---------------+---------------+
| tbl_a | a_id | |
| tbl_b | b_id | a_id |
+-------------+---------------+---------------+
pourquoi dois-je toujours utiliser InnoDb et les clés étrangères, si je n'utilise pas vraiment la magie de clés étrangères dans la fin de toute façon?
Est-il encore un point de l'utilisation
innodb et les clés étrangères
au lieu de
myisam et pas de clés étrangères.
Si je ne l' "NO ACTION
" sur les suppressions ou les mises à jour?
J'espère que vous avez compris mon point d'intérêt 🙂
N'est-il pas de s'assurer que les clés étrangères correspondrait, valide les lignes?
Si vous supprimez étrangères ligne de vos données n'est pas complète, et vous allez avoir de gros désordre dans la DB.
Si vous supprimez étrangères ligne de vos données n'est pas complète, et vous allez avoir de gros désordre dans la DB.
OriginalL'auteur Preexo | 2012-08-23
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes l'incompréhension de ce que
ON DELETE NO ACTION
moyens. Il ne pas moyen de supprimer la contrainte de clé étrangère.Lorsque vous supprimez un enregistrement qui est référencée par une clé étrangère, InnoDB a la possibilité de prendre une action automatique pour corriger la situation:
CASCADE
, de sens, de supprimer la référence d'enregistrement. (Ce qui serait logique pour quelque chose commeuser_address.user_id
. Si vous-supprimer un utilisateur, vous voulez probablement dur-pour supprimer toutes de l'utilisateur, l'adresse.)SET NULL
, de sens, de supprimer la référence de la clé. (Cela peut faire sens pour quelque chose commefile.last_modified_by
. Si vous-supprimer un utilisateur, vous pourriez voulez que le fichier de dernière modification par un simple "inconnu".)Si vous spécifiez
NO ACTION
, vous dites InnoDB que vous ne voulez pas de prendre l'une de ces actions. Alors InnoDB ne peut pas corriger la situation pour vous; tout ce qu'il peut faire est de rejeter laDELETE
et retourner une erreur.Comme un résultat,
ON DELETE NO ACTION
est en fait le même queON DELETE RESTRICT
(valeur par défaut).(Remarque: dans certains DBMSes, et dans le standard SQL,
ON DELETE NO ACTION
est un peu différent deON DELETE RESTRICT
: dans ceux,ON DELETE NO ACTION
signifie "accepter leDELETE
dans la transaction en cours, mais de rejeter l'ensemble de la transaction si j'essaie de le commettre, avant de corriger le problème". Mais InnoDB ne prend pas en charge différée des contrôles, de sorte qu'il traiteON DELETE NO ACTION
exactement le même queON DELETE RESTRICT
, et toujours rejette laDELETE
immédiatement.)Voir §§14.2.2.5 "les Contraintes de CLÉ ÉTRANGÈRE" et 13.1.17.2 "à l'Aide des Contraintes de CLÉ ÉTRANGÈRE" dans le Manuel de Référence de MySQL 5.6.
Vous êtes les bienvenus!
mais pourquoi ne phpmyadmin offrir à la fois: "PAS d'ACTION" et de "LIMITER"? font-ils mal?
Eh bien, MySQL supporte à la fois les notations, donc je suppose que phpmyadmin estime qu'il devrait leur offrir à la fois? Et je ne pouvais imaginer un moteur de stockage manutention différemment -- certains DBMSes ne les traiter un peu différemment (comme mentionné dans la documentation que j'ai relié à) -- alors peut-être phpmyadmin se sent que c'est plus sécurisant pour l'avenir afin de permettre aux utilisateurs de choisir.
Je suis d'accord avec le demandeur, ici. "PAS d'ACTION" ne communique pas de la même chose que "l'ACTION par DÉFAUT". Pour moi, "PAS d'ACTION", ce qui semble indiquer "ne rien faire", ce qui serait absurde.
OriginalL'auteur
La contrainte de clé étrangère, même sans
ON DELETE /UPDATE CASCADE
assure que si vous insérez une valeur dans la table enfant, qu'il a correctement la valeur correspondante dans la table parent (ou estNULL
si le FK colonne accepte les valeurs null). De tenter d'insérer une valeur non valide dans la table enfant du FK colonne de résultat dans l'erreur lorsque la contrainte d'échec, de sorte que l'intégrité de vos données sont protégées.La définition de la contrainte de clé étrangère aussi implicitement définit un index sur la FK colonne dans la table enfant, qui, bien que vous pourriez avoir défini manuellement l'index, permettra d'améliorer de rejoindre la performance.
ON DELETE NO ACTION
(qui est le même que l'omission de laON DELETE
clause) activement empêcher la suppression d'une ligne parent s'il est référencé par une table d'enfant, pas passivement à être supprimé sans affecter les lignes enfants.-1, désolé. Techniquement parlant, chaque état unique dans votre réponse est correcte; mais l'effet global de votre réponse consiste à peindre une très trompeuse image de ce
NO ACTION
moyens.Déjà édité.
Il semble que vous avez changé votre réponse à reconnaître implicitement que
NO ACTION
est la valeur par défaut-ce qui est bon, et maintenant j'ai édité ma réponse à mentionner que, en tant que bien, mais ce n'était pas mon problème avec votre réponse, de toute façon.assez clair pour vous?
OriginalL'auteur