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 nCREATE 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.
