2011-03-16 17 views
6

¿Podría ocurrir que MySQL genere el mismo ID de autoincrement dos veces?ID de duplicado de MySQL

tenemos la siguiente situación:

  1. un proyecto de ley con id = 100 se creó;

  2. luego se eliminó;

  3. luego se creó otra factura y tiene la misma ID = 100;

La estructura de la tabla es:

CREATE TABLE `bill` (
    `id` int(11) NOT NULL auto_increment, 
    `user` int(11) NOT NULL, 
    `date` datetime NOT NULL, 
    `state` int(11) NOT NULL, 
    `adv` bit(1) NOT NULL default b'0', 
    `weight` int(11) default NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK2E2407EC768806` (`user`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `bill` 
    ADD CONSTRAINT `FK2E2407EC768806` FOREIGN KEY (`user`) REFERENCES `user` (`id`); 

¿Podría haber alguna condición o raza es garantía de MySQL los identificadores únicos autoincrement?

ACTUALIZACIÓN: no podemos reproducir esta situación, pero la registramos.

+0

¿Qué quiere decir que haya iniciado sesión que? ¿Muestra que esto realmente sucedió? ¿Puedes mostrarnos? –

+0

Después de crear una factura, también se crea otra factura en un sistema de pago externo con la misma ID, y ese sistema muestra que hay dos facturas con una identificación duplicada. –

+0

¿Los identificadores de la cuenta se insertan en la base de datos desde el sistema de pago también? porque MySQL no debe generar identificadores duplicados en un campo de incremento automático, incluso si se eliminaron algunos de los ID (a menos que trunque la tabla). – BigFatBaby

Respuesta

11

El auto-incremento se maneja de manera diferente por diferentes motores de almacenamiento. Por ejemplo, con MyISAM, el siguiente valor de incremento automático se conserva de manera que si reinicia el servidor MySQL, mantendrá ese valor de incremento automático.

Sin embargo, InnoDB no persiste en el siguiente valor de autoincremento, por lo que si reinicia el servidor MySQL calculará el valor máximo actual e incrementará desde allí.

Esto es importante para usted, ya que está utilizando InnoDB. Entonces, si 100 era el valor máximo de identificación en su tabla, entonces eliminó esa fila, luego reinició el servidor MySQL, luego volvería a usar 100 en la siguiente inserción.

He aquí un ejemplo simple para ilustrar este punto:

mysql> CREATE TABLE `bill` (
    -> `id` int(11) NOT NULL auto_increment, 
    -> PRIMARY KEY (`id`) 
    ->) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.12 sec) 

mysql> -- start at 99 to force next value to 100 
mysql> insert into bill values (99); 
Query OK, 1 row affected (0.01 sec) 

mysql> -- use auto-increment, should be 100 
mysql> insert into bill values (null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from bill; 
+-----+ 
| id | 
+-----+ 
| 99 | 
| 100 | 
+-----+ 
2 rows in set (0.00 sec) 

mysql> -- delete max value 
mysql> delete from bill where id = 100; 
Query OK, 1 row affected (0.00 sec) 

mysql> -- use auto-increment, should be 101 
mysql> insert into bill values (null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from bill; 
+-----+ 
| id | 
+-----+ 
| 99 | 
| 101 | 
+-----+ 
2 rows in set (0.00 sec) 

mysql> -- delete max value 
mysql> delete from bill where id = 101; 
Query OK, 1 row affected (0.00 sec) 

mysql> 
mysql> /*** RESTART MYSQL ***/ 
mysql> 
mysql> -- use auto-increment, should be 100 
mysql> insert into bill values (null); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from bill; 
+-----+ 
| id | 
+-----+ 
| 99 | 
| 100 | 
+-----+ 
2 rows in set (0.00 sec) 
+0

¡Eres genial! ¡Gracias! –

0

¿Quizás la eliminación se realizó antes de que se comprometiera la transacción? Me imagino que en ese caso el registro nunca actualizaría realmente los contadores internos. Es un poco una suposición, pero podría tratar de reproducirlo colocando insertar, seleccionar y eliminar enunciados en un script SQL y rodear cada par de inserción, seleccionar y eliminar con una transacción.

+0

El problema es que la primera inserción, la eliminación y la segunda inserción se realizaron en sus propias transacciones cortas. –

Cuestiones relacionadas