SQL: uso de secuencias
Una secuencia es un conjunto de números enteros 1, 2, 3, ... que se generan en orden bajo demanda. Las secuencias se utilizan con frecuencia en las bases de datos porque muchas aplicaciones requieren que cada fila de una tabla contenga un valor único y las secuencias proporcionan una manera fácil de generarlas.
Este capítulo describe cómo usar secuencias en MySQL.
Usando la columna AUTO_INCREMENT
La forma más sencilla en MySQL de usar secuencias es definir una columna como AUTO_INCREMENT y dejar que MySQL se encargue del resto.
Ejemplo
Pruebe el siguiente ejemplo. Esto creará una tabla y luego insertará algunas filas en esta tabla donde no es necesario dar un ID de registro porque MySQL lo incrementa automáticamente.
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)
Obtener valores AUTO_INCREMENT
LAST_INSERT_ID () es una función SQL, por lo que puede usarla desde cualquier cliente que entienda cómo emitir sentencias SQL. De lo contrario, los scripts de PERL y PHP proporcionan funciones exclusivas para recuperar el valor incrementado automáticamente del último registro.
Ejemplo PERL
Utilizar el mysql_insertidatributo para obtener el valor AUTO_INCREMENT generado por una consulta. Se accede a este atributo a través de un identificador de base de datos o un identificador de declaración, según cómo emita la consulta. El siguiente ejemplo lo hace referencia a través del identificador de la base de datos.
$dbh->do ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh->{mysql_insertid};
Ejemplo de PHP
Después de emitir una consulta que genera un valor AUTO_INCREMENT, recupere el valor llamando al mysql_insert_id( ) función.
mysql_query ("INSERT INTO INSECT (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysql_insert_id ($conn_id);
Renumerar una secuencia existente
Puede darse el caso de que haya eliminado muchos registros de una tabla y desee volver a secuenciar todos los registros. Esto se puede hacer usando un truco simple, pero debe tener mucho cuidado al hacer esto y verificar si su mesa tiene una unión con otra mesa o no.
Si determina que volver a secuenciar una columna AUTO_INCREMENT es inevitable, la forma de hacerlo es eliminar la columna de la tabla y luego agregarla nuevamente.
El siguiente ejemplo muestra cómo volver a numerar los valores de identificación en la tabla de insectos utilizando esta técnica.
mysql> ALTER TABLE INSECT DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);
Iniciar una secuencia con un valor particular
De forma predeterminada, MySQL iniciará la secuencia desde 1, pero también puede especificar cualquier otro número en el momento de la creación de la tabla.
El siguiente bloque de código tiene un ejemplo donde MySQL comenzará la secuencia desde 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
);
Alternativamente, puede crear la tabla y luego establecer el valor de secuencia inicial con ALTER TABLE.
mysql> ALTER TABLE t AUTO_INCREMENT = 100;