Usar secuencias de MySQL
Una secuencia es un conjunto de números enteros 1, 2, 3, ... que se generan en orden según una demanda específica. 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 deje 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
los LAST_INSERT_ID( )es una función SQL, por lo que puede utilizarla desde cualquier cliente que sepa 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_insertid atributo para obtener el AUTO_INCREMENTvalor 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( ) mando.
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 hacerlo si su tabla se une con la otra tabla.
Si determina que la resecuenciación de 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 id values en la mesa usando 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 programa es un ejemplo que muestra cómo MySQL iniciará 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 el ALTER TABLE mando.
mysql> ALTER TABLE t AUTO_INCREMENT = 100;