98 votes

Fondamentaux des clés étrangères en MySQL ?

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 très bien à partir de la documentation de MySQL elle-même. Jusqu'à présent, j'ai géré les 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?

126voto

Quassnoi Points 191041

LES CLÉS ÉTRANGÈRES assurent simplement que vos données sont cohérentes.

Elles ne améliorent pas les requêtes en termes d'efficacité, elles font simplement échouer certaines requêtes incorrectes.

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 département s'il y a des employés associés.

Si vous fournissez ON DELETE CASCADE à la définition de la CLÉ ÉTRANGÈRE, les lignes référencées seront automatiquement supprimées avec celles référencées.

En tant que contrainte, LES CLÉS ÉTRANGÈRES ralentissent un peu les requêtes.

Des vérifications supplémentaires doivent être effectuées lors de la suppression d'une ligne d'une table référencée ou de l'insertion dans une table référençant une autre.

1 votes

Le ralentissement est minime, car vous effectuez généralement des FK sur des champs indexés, ce qui facilite la recherche des valeurs pertinentes en un clin d'œil.

5 votes

C'est pourquoi j'ai écrit "un peu" :) En fait, si vous supprimez beaucoup de lignes, la jointure sous-jacente JOIN peut être beaucoup moins efficace que deux suppressions utilisant les analyses complètes des tables.

0 votes

Est-ce que je peux créer un nouvel employé avec un dept_id qui est absent dans département (id) ?

34voto

Chad Birch Points 39087

Les principaux avantages de l'utilisation de vraies clés étrangères sont garantir l'intégrité des données et pouvoir configurer des actions en cascade sur les éléments liés lorsqu'un élément est modifié ou supprimé.

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

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

Pour le bénéfice en cascade, vous pouvez le configurer pour que si un sujet est supprimé de la table des sujets, la base de données supprime automatiquement tous les messages dans la table des messages qui étaient attachés à ce sujet. C'est pratique car cela supprime une étape que vous auriez à vous rappeler de faire manuellement, ce qui peut devenir assez complexe lorsque vous avez de nombreuses tables liées entre elles. Avec des clés étrangères, toutes les relations peuvent être nettoyées automatiquement.

11voto

Gaurav Kumar Points 167

1. LES CLÉS ÉTRANGÈRES garantissent simplement que vos données sont cohérentes.

2. Si nous appliquons la clause ON DELETE CASCADE à la définition de la clé étrangère, la ligne de référence sera automatiquement supprimée lorsque la ligne parent sera supprimée.

3. Si nous appliquons la clause ON UPDATE CASCADE à la définition de la clé étrangère, la ligne enfant sera mise à jour automatiquement lorsque la ligne parent sera mise à jour.

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

  1. Vous ne pouvez pas supprimer directement la table parent, vous devez d'abord supprimer la clé étrangère de la table enfant puis supprimer la table parent.

7 votes

Enfin réalisé ce qui me confusait à propos des 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 environ, cela ne semblera peut-être plus aussi étrange.

1 votes

Merci d'avoir donné des noms d'exemple à vos tables comme "child" et "parent"... c'est en fait plutôt utile et je souhaite que la documentation officielle le fasse !

7voto

Seb Points 17238

Le principal avantage est que vous pouvez limiter les valeurs que vous pouvez entrer dans la table; 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 définir qu'elle mette automatiquement à jour la valeur ou supprime en cascade toute ligne contenant cette valeur.

C'est en effet une excellente fonctionnalité qui optimise votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X