11.Champ auto-incrémenté

11.1.Introduction

Dans le chapitre présentant les jointures entre tables[où?] nous avons constaté que bien souvent il est intéressant de représenter un enregistrement par un identifiant numérique unique.
Pour affecter un tel identifiant à chaque nouvel élément inséré dans une table donnée, nous pourrions envisager d'exécuter une première requête afin de récupérer la plus grande valeur de "id" déjà utilisée, l'incrémenter de un et utiliser cette nouvelle valeur dans une requête INSERT INTO.
En fait, cette façon de faire est tout à fait inenvisageable:
  • Cela oblige de faire au minimum 2 requêtes à chaque nouvelle insertion
  • Dans le cas, où, 2 programmes seraient amenés à insérer un nouvel enregistrement quasiment au même instant, les 2 programmes vont trouver exactement la même valeur pour le plus grand identifiant déjà utilisé (le programme 2 ayant déterminé cette valeur juste après le programme 1 et juste avant que le programme 1 n'ait fait d'insertion). Ils vont donc, chacun de leur coté, insérer dans la base 2 enregistements différents avec le même identifiant. Faussant complétement la cohérence de la base
  • Si le dernier enregistrement est supprimé, son identifiant sera ré-affecté au prochain enregistrement ce qui peut être source de confusion.
Pour éviter cela, il est possible de demander à la base d'incrémenter un compteur interne associé à la base et nous retourner la dernière valeur trouvée. Ce compteur peut prendre le nom de champ auto-incrémenté, séquence, etc. Dans, ce cas, le serveur fait "patienter" le programme 2 (on dit qu'il pose un verrour) tant qu'il traite la demande du programme 1. De ce fait, il est impossible que 2 programmes ne se retrouvent avec la même valeur d'identifiant.
Si, au moment de la création de la base, nous indiquons qu'un champ doit être auto incrémenté alors à chaque nouvelle insertion ce champ prendra automatiquement la valeur suivante de la séquence (à partir du moment où la valeur de ce champ n'est pas précisée lors de l'insertion). Malheureusement la syntaxe dépend fortement du type de serveur de base de données.

11.2.avec MySQL

Avec MySQL, un champ auto-incrémenté se déclare avec le mot clé AUTO_INCREMENT placé après un type entier (typiquement INTEGER ou BIGINT selon le nombre d'enregistrement attendu). Il ne peut y avoir qu'un seul champ auto-incrémenté par table et ce champ est obligatoirement une clé par conséquent le mot clé AUTO_INCREMENT est systématiquement associé à PRIMARY KEY. De plus un tel champ est nécessairement non NULL et positif ce qui donne au final
CREATE TABLE matable (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ...autres champs...)
L'insertion de données se fait alors comme suit:
INSERT INTO (categorie) VALUES ('nouvellecategorie')
Le champ id n'étant pas précisé, il prend la valeur par défaut, à savoir: la valeur suivante du compteur.

11.3.avec PostgreSQL

Tout cela doit être défini au moment de la création de la table, par une requête du type:
CREATE TABLE matable (id serial, ...autres champs...)
L'insertion de données se fait alors comme suit:
INSERT INTO (categorie) VALUES ('nouvellecategorie')
Le champ id n'étant pas précisé, il prend la valeur par défaut, à savoir: la valeur suivante du compteur.