Les bases des clés étrangères dans MySQL?

91

Y a-t-il une bonne explication sur la façon d'utiliser la construction de clé étrangère de MySQL?

Je ne comprends pas tout à fait les documents MySQL eux-mêmes. Jusqu'à présent, j'ai manipulé des choses comme des clés étrangères avec des jointures et du code de programmation.

Et la deuxième partie de la question, y a-t-il des améliorations à apporter en utilisant les clés étrangères intégrées de MySQL?

Macha
la source

Réponses:

117

FOREIGN KEYS assurez-vous simplement que vos données sont cohérentes.

Ils n'améliorent pas les requêtes en termes d'efficacité, ils font simplement échouer certaines requêtes erronées.

Si vous avez une relation comme celle-ci:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, alors vous ne pouvez pas supprimer un departments'il en a employee.

Si vous fournissez ON DELETE CASCADEla FOREIGN KEYdéfinition, les lignes de référence seront supprimées automatiquement avec celles référencées.

En tant que contrainte, FOREIGN KEYralentit un peu les requêtes.

Une vérification supplémentaire doit être effectuée lors de la suppression d'une table référencée ou de l'insertion dans une table de référence.

Quassnoi
la source
1
Le ralentissement est minime, car vous créez généralement FK sur les champs indexés, ce qui facilite la recherche des valeurs pertinentes.
Seb
4
C'est pourquoi j'ai écrit "un peu" :) En fait, si vous supprimez beaucoup de lignes, le sous JOIN- jacent peut être beaucoup moins efficace que deux DELETE utilisant FULL TABLE SCAN's
Quassnoi
2
Désolé pour le vote négatif. C'était accidentel, mais cela ne me permet pas de changer mon vote.
Wondercricket
8
@Wondercricket: Je ne sais même pas quoi faire maintenant, c'est une zone grise dans les règles du site. Je pense que tu m'achètes une bière quand tu es à Moscou et nous sommes encore.
Quassnoi
1
@stack: toute mise à jour que vous effectuez sur la clé référencée cascades vers la table de référencement.
Quassnoi
32

Les principaux avantages de l'utilisation de véritables clés étrangères sont d'assurer l'intégrité des données et de pouvoir configurer des actions en cascade sur des éléments associés lorsqu'un élément est modifié ou supprimé.

Par exemple, imaginez que vous programmez un forum. Vous avez une table «sujets» avec une clé primaire topics.topic_id, et vous avez une table «articles» où les articles sont attachés aux sujets avec la colonne posts.topic_id, qui est une clé étrangère vers le tableau des sujets.

Cette relation de clé étrangère garantit que chaque message est associé à un sujet valide. Si le seul sujet que vous avez a l'ID # 1, il est impossible qu'il existe un article dans la base de données attaché au sujet # 2. La base de données garantit cela.

Pour l'avantage en cascade, vous pouvez le configurer de sorte que si une rubrique est supprimée de la table des rubriques, la base de données supprime automatiquement toutes les publications de la table des publications qui étaient attachées à cette rubrique. C'est bien car cela supprime une étape que vous devez vous rappeler de faire manuellement, ce qui peut devenir assez complexe lorsque de nombreuses tables sont liées entre elles. Avec les clés étrangères, toutes les relations peuvent être nettoyées automatiquement.

Chad Birch
la source
11

1.FOREIGN KEYS assurez-vous que vos données sont cohérentes.

2. Si nous appliquons la suppression en cascade à la définition de clé étrangère, la ligne de référence sera supprimée automatiquement lorsque la ligne parente sera supprimée.

3. Si nous appliquons sur Update Cascade à la définition de clé étrangère, la ligne enfant sera mise à jour automatiquement lorsque la ligne parent sera mise à jour.

Requête: ALTER TABLE enfant ADD FOREIGN KEY (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. vous ne pouvez pas supprimer la table parent directe, supprimez d'abord la clé étrangère de la table enfant que supprimez la table parent.
Gaurav Kumar
la source
7
J'ai enfin réalisé ce qui me déroutait dans les exemples de clés étrangères. En tant que père de quatre enfants , je ne suis pas habitué à ce que l' enfant suive le parent . Dans une quarantaine d'années, cela pourrait ne plus sembler en arrière.
Bob Stein
1
Merci d'avoir donné à vos exemples des noms de tables comme "enfant" et "parent" ... c'est en fait plutôt utile et j'aimerais que la documentation officielle le fasse!
mike rodent
7

Le principal avantage est que vous pouvez limiter les valeurs que vous pouvez saisir dans le tableau; si vous essayez d'entrer une valeur qui n'existe pas dans la table référencée, vous ne pourrez pas le faire.

De plus, si vous mettez à jour ou supprimez la valeur dans la table référencée, vous pouvez la configurer pour qu'elle mette à jour automatiquement la valeur ou supprime en cascade toute ligne contenant cette valeur.

C'est en effet une excellente fonctionnalité tirant parti de votre code.

Seb
la source