SQL - Utilisation de séquences

Une séquence est un ensemble d'entiers 1, 2, 3, ... qui sont générés dans l'ordre à la demande. Les séquences sont fréquemment utilisées dans les bases de données, car de nombreuses applications exigent que chaque ligne d'une table contienne une valeur unique et les séquences permettent de les générer facilement.

Ce chapitre décrit comment utiliser des séquences dans MySQL.

Utilisation de la colonne AUTO_INCREMENT

La manière la plus simple dans MySQL d'utiliser des séquences est de définir une colonne comme AUTO_INCREMENT et de laisser le reste à MySQL pour s'en occuper.

Exemple

Essayez l'exemple suivant. Cela créera une table et après cela, il insérera quelques lignes dans cette table où il n'est pas nécessaire de donner un ID d'enregistrement car il est auto-incrémenté par MySQL.

mysql> CREATE TABLE INSECT
   -> (
   -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   -> PRIMARY KEY (id),
   -> name VARCHAR(30) NOT NULL, # type of insect
   -> date DATE NOT NULL, # date collected
   -> origin VARCHAR(30) NOT NULL # where collected
);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO INSECT (id,name,date,origin) VALUES
   -> (NULL,'housefly','2001-09-10','kitchen'),
   -> (NULL,'millipede','2001-09-10','driveway'),
   -> (NULL,'grasshopper','2001-09-10','front yard');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM INSECT ORDER BY id;
+----+-------------+------------+------------+
| id | name        | date       | origin     |
+----+-------------+------------+------------+
|  1 | housefly    | 2001-09-10 | kitchen    |
|  2 | millipede   | 2001-09-10 | driveway   |
|  3 | grasshopper | 2001-09-10 | front yard |
+----+-------------+------------+------------+
3 rows in set (0.00 sec)

Obtenir les valeurs AUTO_INCREMENT

Le LAST_INSERT_ID () est une fonction SQL, vous pouvez donc l'utiliser depuis n'importe quel client qui comprend comment émettre des instructions SQL. Sinon, les scripts PERL et PHP fournissent des fonctions exclusives pour récupérer la valeur auto-incrémentée du dernier enregistrement.

Exemple PERL

Utilisez le mysql_insertidattribut pour obtenir la valeur AUTO_INCREMENT générée par une requête. Cet attribut est accessible via un descripteur de base de données ou un descripteur d'instruction, selon la façon dont vous émettez la requête. L'exemple suivant le référence via le handle de base de données.

$dbh->do ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysql_insertid};

Exemple PHP

Après avoir émis une requête qui génère une valeur AUTO_INCREMENT, récupérez la valeur en appelant le mysql_insert_id( ) fonction.

mysql_query ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);

Renuméroter une séquence existante

Il peut y avoir un cas où vous avez supprimé de nombreux enregistrements d'une table et que vous souhaitez réorganiser tous les enregistrements. Cela peut être fait en utilisant une astuce simple, mais vous devez être très prudent et vérifier si votre table a une jointure avec une autre table ou non.

Si vous déterminez que la remise en séquence d'une colonne AUTO_INCREMENT est inévitable, la façon de le faire est de supprimer la colonne de la table, puis de l'ajouter à nouveau.

L'exemple suivant montre comment renuméroter les valeurs d'id dans la table d'insectes à l'aide de cette technique.

mysql> ALTER TABLE INSECT DROP id;
mysql> ALTER TABLE insect
   -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
   -> ADD PRIMARY KEY (id);

Démarrage d'une séquence à une valeur particulière

Par défaut, MySQL démarrera la séquence à partir de 1, mais vous pouvez également spécifier n'importe quel autre nombre au moment de la création de la table.

Le bloc de code suivant a un exemple où MySQL démarrera la séquence à partir de 100.

mysql> CREATE TABLE INSECT
   -> (
   -> id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
   -> PRIMARY KEY (id),
   -> name VARCHAR(30) NOT NULL, # type of insect
   -> date DATE NOT NULL, # date collected
   -> origin VARCHAR(30) NOT NULL # where collected
);

Vous pouvez également créer la table, puis définir la valeur de séquence initiale avec ALTER TABLE.

mysql> ALTER TABLE t AUTO_INCREMENT = 100;