2009-09-30 12 views
10

Tengo una tabla MySQL con una columna de identificación autoincrementada. La identificación comenzó desde 1 y ahora está en 4000s.¿Qué sucede cuando el autoincremento choca con los datos existentes en MySQL?

Sin embargo, también debo portar algunos datos heredados en esta tabla desde una versión anterior de la aplicación. Los ID de estos datos comienzan desde 5000 y se deben preservar para fines de auditoría.

¿Qué sucede si inserto una entrada después de que mi contador autoincrement es de hasta 4999? ¿Es la autoincrementación lo suficientemente inteligente como para buscar la próxima identificación disponible o se bloqueará porque intenta insertar la identificación 5000, que ya existe?

Si bien los consejos sobre cómo solucionar este problema son muy útiles, también me gustaría saber qué haría MySQL en esta situación y si necesito intervenir en absoluto.

Respuesta

4

Autoincrement utilizará el siguiente id disponible para las tablas InnoDB y MyISAM.

He probado esto para MySQL 4.1.22 que se ejecuta en Windows Vista. Creé dos tablas simples, una usando InnoDB y otra usando MyISAM. Cada uno tenía una clave principal autoincrementing llamada 'id' y una columna varchar llamada 'description'.

que corrieron los siguientes comandos (sin errores):

INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert'); 
INSERT INTO MyIsamTest (description)  VALUES ('autoincrement id insert'); 

SELECT * FROM MyIsamTest; 

me dieron el siguiente resultado, que muestra que la columna 'id' se autoincremented correctamente:

+=====+=========================+ 
| id | description    | 
+=====+=========================+ 
| 1 | autoincrement id insert | 
+-----+-------------------------+ 
| 100 | manual id insert  | 
+-----+-------------------------+ 
| 101 | autoincrement id insert | 
+-----+-------------------------+ 

Repetí la experimento en mi tabla InnoDbTest con el mismo resultado.

+0

Tenemos algo que está pasando en una tabla Transactional innoDB donde se autoincrementa hacia arriba, pero debajo de la identificación máxima. Creo que esta simple prueba es simplemente muy simple. Estoy bastante seguro de que mysql omitirá automáticamente las ID existentes, pero no estoy 100% –

+0

Sí, tenemos una autoincrementación de innoDb menor que max (id), no estoy seguro de lo que sucederá –

+0

El problema con su prueba aquí es que usted tiene insertado con una instrucción de inserción normal. He tenido bastantes problemas en los que he restaurado regularmente una base de datos de producción en un servidor de desarrollo, y los incrementos automáticos del servidor de desarrollo no se actualizan y, por lo tanto, colisionan con los registros ahora existentes de producción cuando voy a crear una nueva entrada en dev. –

6

Autoincrement utilizará el siguiente ID disponible para ambas tablas InnoDB y MyISAM, pero se puede cambiar manualmente la siguiente posición de la siguiente manera:

Después de su inserción, se puede establecer el incremento automático a un valor por encima de la ahora -highest Identificación:

ALTER TABLE tbl AUTO_INCREMENT = 9000; 
+0

+1 - es muy probable que haya varias tablas de sus datos heredados, y esta es la mejor manera de evitarlo. – nickf

+0

No es necesario, se hace automáticamente. – DisgruntledGoat

0

Si sólo tiene una tabla legado sin dependencias de los identificadores, a continuación, lo que haría es crear una tabla temporal para insertar todos sus nuevos datos en (con la ID de 5000+) . A continuación, ejecute esto:

INSERT INTO `myrealtable` (column1, column2, column3) 
SELECT column1, column2, column3 
FROM `temptable`; 

DROP TABLE `temptable`; 

... donde ninguna de las columnas columnX es la identificación auto_increment principal.

0

Pruébelo en una base de datos de prueba y ver qué pasa, con lampp/xampp etc.

0

Creo cheques MySQL si se inserta en una columna de auto-incrementales y se actualizará de manera que AUTO_INCREMENT AUTO_INCREMENT> MAX (id), pero necesito revisar los documentos. Deberías seguir la sugerencia de Andrew Duffy para estar seguro.

0

MySQL no le permite establecer el "valor" auto_increment interno inferior al ID más alto actual.

Por lo tanto, si agrega 1000 filas a partir de 5000, el incremento se establece en 6000. Todavía puede agregar filas con ID que todavía no existen (por ejemplo 4500) pero realmente no vale la pena molestarse. Hay muchos números entre 6000 y 4 mil millones.

0

Si inserta datos con las claves primarias ya asignadas en MyISAM, el valor de la columna AUTO_INCREMENT para la próxima inserción será max (columna) + 1, por lo que funcionará.

Sin embargo, no está utilizando MyISAM debido a que estos son datos importantes, está utilizando InnoDB, que necesita la instrucción ALTER TABLE citada anteriormente.

Cuestiones relacionadas