La clé primaire dans une table
Une clé primaire est un champ ou un groupe de champs qui permet d'identifier un enregistrement dans une table. Identifier, ça veut dire qu'il n'y a qu'un seul enregistrement qui est identifié par la clé, la clé primaire est unique.
Imaginons un exemple simple : une table servant à stocker des adresses :
CREATE TABLE `adresse` ( `numero` INT(10) NULL, `rue` VARCHAR(50) NULL, `ville` VARCHAR(50) NULL, `proprietaire` VARCHAR(100) NULL, PRIMARY KEY (`numero`, `rue`, `ville`) );
J'ai créé une clé primaire sur les 3 champs : numéro, rue et ville. Cela signifie que je ne pourrais pas insérer plusieurs adresses identiques dans ma base. Quand on essaie, MySQL renvoie une erreur :
INSERT INTO `adresse` (`numero`, `rue`, `ville`, `proprietaire`) VALUES (10, 'rue de Courcelles', 'Paris', 'Pierre Dupont'); /* => Tout c'est bien passé */ INSERT INTO `adresse` (`numero`, `rue`, `ville`, `proprietaire`) VALUES (10, 'rue de Courcelles', 'Paris', 'Pierre Martin'); /* => SQL Error (1062): Duplicata du champ '10-rue de Courcelles-Paris' pour la clef 'PRIMARY' */
À quoi sert une clé primaire ?
La clé primaire n'est pas obligatoire, mais elle est indispensable, car elle est utilisée entre autres pour l'écriture des données. Si vous souhaitez mettre à jour un enregistrement (requête UPDATE
) ou le supprimer (DELETE
), il vous faut un moyen de désigner précisément l'enregistrement à traiter, pour être sur de n'impacter que celui-là et pas d'autres. Si une table ne comporte pas de clé primaire, on ne peut pas garantir ça, du coup on risque de corrompre les données ou d'altérer les données de manière involontaire.
De plus, les clés primaires jouent un rôle très important dans les performances de la base de données, car derrière chaque clé primaire se cache un index.
Comment choisir la clé primaire ?
Comme on l'a vu dans l'exemple de la table adresse, une clé primaire peut être composée de plusieurs champs. On appelle clé candidate chaque champ qu'on peut potentiellement choisir comme clé primaire.
Il n'y a pas de contrainte technique notable quant au choix d'une clé primaire sur MySQL. Certains types de champs ne peuvent pas servir de clé primaire, voici par exemple ce qui se passe avec un champ BLOB :
SQL Error (1170): La colonne 'texte' de type BLOB est utilisée dans une définition d'index sans longueur d'index
Pour autant, ce choix doit être fait de manière intelligente :
- Il faut utiliser des champs les plus légers possible. Le mieux étant un entier, éviter les types de champs potentiellement volumineux comme TEXT et BLOB
- Utiliser la clé la plus simple possible : moins il y a de champs, mieux c'est, car cela simplifie l'utilisation de la clé primaire dans les requêtes, et les index sont plus légers
Une clé primaire peut être soit atomique (composée que d'un seul champ) ou composite (composée de plusieurs champs, comme pour la table adresse).
Après avoir lu excel affiche des dièse à la place du texte vous en saurez d'avantage sur ce sujet.
En général, on utilise de qu'on appelle une clé artificielle comme clé primaire : il s'agit d'un champ qui n'a aucun rapport avec les données, et qui existe uniquement dans le but de servir de clé primaire. MySQL gère très bien ce type de champ grâce à l'attribut AUTO_INCREMENT
qui sert à créer un compteur qui s'incrémente automatiquement à chaque INSERT
.
Les avantages sont multiples :
- ça évite de se prendre la tête à choisir la clé,
- Cela allège les contraintes. Si on reprend l'exemple de la table adresse, le fait d'avoir défini une clé primaire sur les 3 champs
(numero, rue, ville)
nous empêche d'avoir une ville qui comporterait 2 rues portant le même nom. Avec une clé artificielle, plus de problème. - Les clés étrangères sont plus faciles à créer quand la clé primaire est atomique (on a besoin que d'un seul champ pour référencer la clé primaire depuis les autres tables).
Voici comment créer une table avec une clé primaire AUTO INCREMENT sur MySQL :
CREATE TABLE `adresse` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `numero` INT(10) NOT NULL DEFAULT '0', `rue` VARCHAR(50) NOT NULL DEFAULT '', `ville` VARCHAR(50) NOT NULL DEFAULT '', `proprietaire` VARCHAR(100) NULL DEFAULT NULL, PRIMARY KEY (`id`) );
Découvrez ce tutoriel photoshop : appartement sous-marin à lire tout de suite !
Mais est-il envisageable de supprimer l'index de la clef primaire (ou plutôt artificielle) au profit d'un autre index d'une colonne de la table. Tout ceci, dans le but de ne pas perdre inutilement de la place.
"Si on reprend l'exemple de la table adresse, le fait d'avoir défini une clé primaire sur les 3 champs (numero, rue, ville) nous empêche d'avoir une ville qui comporterait 2 rues portant le même nom.".
L'unicité se fait sur le tuple entier, il est dont possible que la table possède 2 tuples avec les mêmes valeurs des champs rue et ville. Cependant il est impossible de trouver plusieurs fois la même combinaison des champs rue,numéro et ville dans la table.
Exemple : (2, Jeanne D'arc, Paris) ne peut être présent plus d'une fois, en revanche il peut cohabiter avec le tuple (3,Jeanne D'arc, Paris).