Qu'est-ce qu'une clé étrangère ?
Dans une table d'une base de données MySQL, une clé étrangère est un champ dont la valeur fait référence à la clé primaire d'une autre table.
On va prendre l'exemple de finalclap, qui contient des tutoriels qui appartiennent à des catégories (Photoshop, After Effects, PHP...) :
CREATE TABLE `categorie` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `titre` VARCHAR(250) NULL DEFAULT NULL, `description` TEXT NULL, PRIMARY KEY (`id`) );
CREATE TABLE `tuto` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `categorie_id` INT(11) NULL DEFAULT NULL COMMENT 'FK id de la catégorie', `titre` VARCHAR(150) NOT NULL COLLATE 'utf8_general_ci', `contenu` TEXT NOT NULL COLLATE 'utf8_general_ci', PRIMARY KEY (`id`) );
Dans la table tuto, le champs categorie_id (tuto.categorie_id
) fait référence au champ id de la table categorie (categorie.id
). C'est ça qui permet de rattacher un tutoriel à une catégorie.
On dit que le champs categorie_id
est une clé étrangère (Foreign key). Les clés étrangères matérialisent les relations entre les tables.
Contrainte d'intégrité
Le système de base de données peut veiller à l'intégrité des données grâce aux contraintes d'intégrité (ou dépendance fonctionnelle). On appelle ça un SGBDR (système de gestion de base de données relationnelle).
Qu'est-ce que l'intégrité référentielle des données ?
Les données sont intégres lorsqu'elles sont cohérentes. Je m'explique : si on reste sur l'exemple de finalclap avec la table categorie et la table tuto, chaque tuto doit faire référence à une catégorie qui existe dans la table catégorie.
Si un tuto est rattaché à une catégorie qui n'existe pas (par exemple, la catégorie "Trucmuche" #45587, alors les données ne sont pas cohérentes, les données sont "pourries".
MyISAM et InnoDB
Pour créer une contrainte d'intégrité dans MySQL, il faut utiliser le moteur InnoDB. En effet, le moteur par défaut : MyISAM, ne gère pas les clé étrangères.
Après avoir lu additionner les x plus grands chiffres avec excel vous en saurez d'avantage sur ce sujet.
L'ajout d'une clé étrangère à une table se fait à l'aide d'une requête SQL :
ALTER TABLE `tuto` ADD CONSTRAINT `FK_tuto_categorie` FOREIGN KEY (`categorie_id`) REFERENCES `categorie` (`id`);
Chaque contrainte d'intégrité porte un nom, en général on utilise des conventions pour ça : le nom commence par le préfixe FK_
(comme Foreign Key) puis le nom de la table source, et enfin le nom de la table cible (celle à laquelle on fait référence).
La valeur NULL
Il arrive qu'on ne souhaite pas de référence pour certains enregistrements, par exemple : un tuto qui n'appartiendrait à aucune catégorie. Dans ce cas, il faut donner au champ tuto.categorie_id
la valeur NULL
.
NULL est une constante qui représente le vide (c'est différent de 0 pour un entier et d'une chaîne vide, NULL est une constante qui sert précisément à représenter l'absence de donnée, indépendamment du type du champ).
Encore faim ? allez lire ça : style street !