La clé primaire dans une table

Mars 2013

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 !

1 commentaire :
commentaire n°3009 par enls
enls mardi 17 février 2015, 19:19
Votre article est très intéressant !

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.
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré