En MySQL version 3.23.44 et plus récentes, les tables
InnoDB
supportent les vérifications
d'intégrité référentielles. See Chapitre 15, Le moteur de tables InnoDB
.
Pour les autres types de tables, le serveur mySQL accepte la
syntaxe FOREIGN KEY
dans la commande
CREATE TABLE
, mais ne la prend pas en
compte.
Pour les autres moteurs de stockage que
InnoDB
, MySQL analyse la clause
FOREIGN KEY
de la commande CREATE
TABLE
, mais ne l'utilise pas et ne la stocke pas.
Dans le futur, l'implémentation va stocker cette information
dans le fichier de spécifications de tables, pour qu'elle
puisse être lue par mysqldump
et ODBC.
Ultérieurement, les contraintes de clé étrangères seront
incluses dans les tables MyISAM
.
Voici des avantages aux contraintes de clés étrangères :
En supposant que les relations soient proprement con¸ues, les clés étrangères rendent plus difficile pour un programmeur d'insérer des valeurs incohérentes dans la base.
La vérification centralisée de contraintes par le serveur de base de données rend inutiles l'application de ces vérifications du coté de l'application. Cela élimine la possibilité que d'autres applications ne fassent pas les vérifications de la même fa¸on que les autres.
L'utilisation des modifications et effacement en cascade simplifie le code du client.
Les règles de clés étrangères proprement con¸ues aident à la documentation des relations entre les tables.
Gardez bien en tête que ces avantages ont un coût supérieur pour le serveur de bases, qui doit effectuer les tests. Les vérifications supplémentaires affectent les performances, ce qui est parfois suffisamment rebutant pour des applications qui les éviteront. Certaines applications commerciales ont placé la logique de vérification dans l'application, pour cette raison.
MySQL donne aux développeurs de bases de données le choix de
leur approche. Si vous n'avez pas besoin des clés
étrangères, et que vous voulez éviter leur surcoût, vous
pouvez choisir un autre type de table, comme
MyISAM
. Par exemple, les tables
MyISAM
sont extrêmement rapides pour les
applications qui font essentiellement des opérations
INSERT
et SELECT
, car
elles peuvent être utilisées simultanément. See
Section 7.3.2, « Problème de verrouillage de tables ».
Si vous décidez de ne pas tirer avantage des contraintes d'intégrité, vous devez garder en tête ces conseils :
En l'absence de vérification du coté du serveur, l'application doit se charger de ces vérifications. Par exemple, elle doit s'assurer que les lignes sont insérées dans le bon ordre, et que les lignes ne sont pas orphelines. Il faut aussi pouvoir rattraper une erreur au milieu d'une opération multiple.
Si la clause ON DELETE
est la seule
fonctionnalité nécessaire, notez que depuis MySQL
version 4.0, vous pouvez utiliser des commandes
DELETE
multi-tables pour effacer les
lignes dans plusieurs tables en une seule commande. See
Section 13.1.1, « Syntaxe de DELETE
».
Un palliatif au manque de ON DELETE
est
d'ajouter la commande DELETE
appropriée lorsque vous effacez des lignes dans une table
qui dispose d'une clé étrangère. En pratique, c'est
souvent plus rapide que d'utiliser les clés étrangères,
et c'est plus portable.
Soyez conscient que l'utilisation des clés étrangères dans certaines circonstances peuvent conduire à des problèmes :
Les clés étrangères règlent des problèmes de cohérence, mais il est nécessaire de concevoir les contraintes correctement, pour éviter les contraintes circulaires, ou des cascades d'effacements incorrects.
Il n'est pas exceptionnel pour un administrateur de créer
une topologie de relations qui rende difficile la
restauration de bases à partir d'une sauvegarde. MySQL
résout ce problème en vous permettant de désactiver
temporairement les contraintes. See
Section 15.7.4, « Contraintes de clés étrangères FOREIGN KEY
». Depuis
MySQL 4.1.1, mysqldump
génère un
fichier d'export qui exploite cette possibilité de
désactivation automatique à l'import.
Notez que les clés étrangères SQL sont utilisées pour
assurer la cohérence des données, et non pas pour joindre
des tables. Si vous voulez obtenir des résultats de tables
multiples dans une commande SELECT
, vous
devez le faire avec une jointure :
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
See Section 13.1.7.1, « Syntaxe de JOIN
». See
Section 3.6.6, « Utiliser les clefs étrangères ».
La syntaxe FOREIGN KEY
sans ON
DELETE ...
est souvent utilisée par les
applications ODBC pour produire automatiquement des clauses
WHERE
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.