Recuerde un error de incremento automático

  
 

Los entresijos de la falla son más o menos así: en una noche negra de fuertes vientos, el programador presionado se despertó con un mensaje de alarma repentino, que era un problema con la base de datos, aunque la operación de consulta era normal. Sin embargo, la operación de creación no se realizó correctamente. Después de la depuración, el motivo fue que la tabla se insertó con una fila de datos de problemas y el valor del campo de autoincremento se estableció explícitamente en el valor máximo del entero, lo que provocó que no se obtuvieran los datos insertados subsiguientes por defecto. Ir a un valor de clave primaria legal.

También podríamos crear una tabla de prueba para ilustrar el problema:

 CREAR TABLA SI NO EXISTE `test` (` id` int (11) NOT NULL AUTO_INCREMENT, `name` varchar (100) NOT NULL , TECLA PRINCIPAL (`id`)) MOTOR = InnoDB; 

Luego inserte una fila de datos de problemas:

 INSERT INTO test (id, nombre) VALUES (2147483647, 'x'); 

resultados No se puede ejecutar la instrucción de inserción normal:

 INSERT INTO test (name) VALUES ('y'); 

La base de datos informará un error:

# 1062 – Entrada duplicada ‘ 2147483647 &rsquo Para la clave ‘ PRIMARIA ’

En otras palabras, el tipo de tabla InnoDB mantiene internamente un contador para el campo Incremento automático para proporcionar un identificador único necesario para las siguientes inserciones. Cada vez que se insertan nuevos datos, el valor del contador se actualiza a MAX + 1. Si inserta datos identificados de forma exclusiva como 2147483647, el contador no se actualizará correctamente porque ha alcanzado el límite superior del tipo de datos INT.

Dado que se ha aclarado el motivo del problema, el primer sentimiento es restablecer el contador del campo Incremento automático a un valor razonable. Podemos intentar ejecutar la siguiente declaración después de eliminar los datos del problema:
< Pre> ALTER TABLE test AUTO_INCREMENT = 123;

Sin duda, este método puede lograr el objetivo, pero hay una desventaja: en MySQL, cuando ALTER una tabla, ¡en realidad es equivalente a recrear una tabla! Si los datos originales son grandes, el proceso será muy lento.

Consideremos otros métodos. Dado que el problema radica en la configuración implícita del identificador único, es posible que deseemos cambiar la idea y establecer explícitamente el identificador único, por ejemplo, mediante "SELECT MAX … FOR UPDATE". La forma en que la consulta directa obtiene un identificador único y se establece explícitamente en la instrucción INSERT que se ejecuta más adelante.

Sin embargo, este método no es lo suficientemente transparente para modificar el código de negocio. Un método más transparente es usar un activador:

 CREAR TABLA seq (`id` int (11) NOT NULL AUTO_INCREMENT,` created `timestamp NOT NULL, PRIMARY KEY (` id`)) Motor = InnoDB; DELIMITER 
						
Copyright © Conocimiento de Windows All Rights Reserved