Si se especifica que una columna de una tabla es
AUTO_INCREMENT
, la entrada para la tabla
InnoDB
en el diccionario de datos contiene un
contador especial llamado "contador de auto incremento", que se
utiliza para asignar nuevos valores a la columna. El contador de
auto incremento se almacena sólo en la memoria principal, no en
disco.
InnoDB
utiliza el siguiente algoritmo para
inicializar el contador de auto incremento para una tabla
T
que contiene una columna
AUTO_INCREMENT
llamada
ai_col
: Luego de iniciarse el servidor,
cuando un usuario realiza por primera vez una inserción en una
tabla T
, InnoDB
ejecuta el
equivalente de esta sentencia:
SELECT MAX(ai_col) FROM T FOR UPDATE;
El valor retornado por la sentencia se incrementa en uno y se
asigna a la columna, y al contador de auto incremento de la
tabla. Si la tabla está vacía, se asigna el valor
1
. Si el contador aún no se ha inicializado
y se ejecuta una sentencia SHOW TABLE STATUS
que muestre su salida para la tabla T
, el
contador se inicializa (pero no se incrementa) y se almacena
para usos posteriores. Nótese que en esta inicialización se
realiza una lectura normal con bloqueo exclusivo y el bloqueo
permanece hasta el final de la transacción.
InnoDB
sigue el mismo procedimiento para
inicializar el contador de auto incremento de una tabla
recientemente creada.
Nótese que si durante un INSERT
el usuario
especifica un valor NULL
o
0
para una columna
AUTO_INCREMENT
, InnoDB
trata a la columna como si no se hubiera especificado un valor y
genera un nuevo valor para ella.
Luego de que el contador de auto incremento ha sido
inicializado, si un usuario inserta una fila que explícitamente
indica para la columna auto incremental un valor mayor que el
valor actual del contador, éste se establece al valor actual de
la columna. Si no se indica un valor, InnoDB
incrementa el valor del contador en uno y lo asigna a la
columna.
Al acceder al contador de auto incremento,
InnoDB
emplea un nivel de bloqueo de tabla
especial AUTO-INC
, que mantiene hasta el
final de la sentencia SQL actual y no hasta el final de la
transacción. Esta estrategia de bloqueo especial fue
introducida para mejorar la concurrencia de inserciones en una
tabla que contiene una columna
AUTO_INCREMENT
. Dos transacciones no pueden
tener el bloqueo AUTO-INC
simultáneamente en
la misma tabla.
Nótese que pueden observarse valores faltantes en la secuencia
de valores asignados a la columna
AUTO_INCREMENT
si se cancelan transacciones
que ya han obtenido números desde el contador.
El comportamiento del mecanismo de auto incremento no se encuentra definido si un usuario asigna un valor negativo a la columna o si el valor se vuelve mayor que el entero más grande que puede almacenarse en el tipo de entero especificado.
A partir de MySQL 5.0.3, InnoDB
soporta la
opción AUTO_INCREMENT =
en sentencias
n
CREATE TABLE
y ALTER
TABLE
, para establecer inicialmente o modificar el
valor actual del contador. El efecto de esta acción es
cancelado al reiniciar el servidor, por las razones tratadas
anteriormente en esta sección.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.