web-dev-qa-db-fra.com

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

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

Je ne l'obtiens pas tout à fait à partir des documents MySQL eux-mêmes. Jusqu'à présent, je manipulais 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?

88
Macha

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))

, vous ne pouvez pas supprimer un department s'il contient des employee.

Si vous fournissez ON DELETE CASCADE au FOREIGN KEY définition, les lignes de référence seront supprimées automatiquement avec celles référencées.

Par contrainte, FOREIGN KEY ralentit 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.

115
Quassnoi

Les principaux avantages de l'utilisation de vraies clés étrangères sont d'assurer l'intégrité des données et de pouvoir configurer des actions en cascade sur les éléments associés lorsque quelque chose est modifié ou supprimé.

Par exemple, imaginez que vous programmez un forum. Vous disposez d'un tableau "sujets" avec la clé primaire topics.topic_id, et vous disposez d'un tableau "articles" dans lequel les articles sont joints à des sujets avec la colonne posts.topic_id, qui est une clé étrangère du tableau des sujets.

Cette relation de clé étrangère garantit que chaque publication est associée à 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ée au sujet # 2. La base de données le garantit.

Pour l'avantage en cascade, vous pouvez le configurer de sorte que si un sujet est supprimé de la table des sujets, la base de données supprime automatiquement tous les messages de la table des messages qui ont été joints à ce sujet. C'est bien, car cela supprime une étape que vous devez vous rappeler de faire manuellement, ce qui peut devenir assez complexe lorsque plusieurs tables sont liées entre elles. Avec les clés étrangères, toutes les relations peuvent être nettoyées automatiquement.

31
Chad Birch

1. TOUCHES ÉTRANGÈRES assurez-vous simplement que vos données sont cohérentes.

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

3. Si nous appliquons la mise à jour de la 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 puis supprimez la table parent.
11
Gaurav Kumar

Le principal avantage est que vous pouvez limiter les valeurs que vous pouvez entrer 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 définir pour mettre à jour automatiquement la valeur ou supprimer en cascade toute ligne contenant cette valeur.

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

6
Seb