Estoy muy perturbado por este comportamiento extraño que veo en el auto_increment
valor registrado en el bidID de una tabla de ofertas después de realizar una inserción masiva utilizando un procedimiento almacenado:
INSERT INTO Bids (itemID, buyerID, bidPrice)
SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice)
FROM Items
WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows;
Por ejemplo, si el auto_increment
valor de bidID es 101 al inicio e inserté 100 filas, el valor final se convierte en 213 en lugar de 201. Sin embargo, los bidID de esas filas insertadas se ejecutan secuencialmente hasta un máximo de 201.
Habiendo comprobado lo siguiente,
SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
No tengo idea de por qué está sucediendo. ¿Qué podría estar causando el salto en el auto increment
valor?
mysql
innodb
mariadb
auto-increment
Desbordamiento de preguntas
fuente
fuente
show variables like '%innodb_autoinc_lock_mode%';
salida?Respuestas:
Esto no es inusual y hay un par de causas. A veces se debe a optimizaciones que realiza el corredor de consultas para reducir los problemas de contención con el recurso contador, mejorando la eficiencia cuando hay actualizaciones concurrentes en la tabla afectada. A veces se debe a transacciones que se revierten explícitamente (o se revierten implícitamente debido a un error).
Las únicas garantías de una
auto_increment
columna (oIDENTITY
en MSSQL, y los otros nombres por los que pasa el concepto) es que cada valor será único y nunca más pequeño que uno anterior: por lo tanto, puede confiar en los valores para ordenar pero no puede confiar en no tener huecosSi necesita que los valores de la columna no tengan vacíos, deberá administrar los valores usted mismo, ya sea en otra capa de lógica de negocios o en la base de datos a través de un disparador (tenga cuidado con los posibles problemas de rendimiento con los disparadores), por supuesto si si hace el suyo propio, tendrá que lidiar con todos los problemas de concurrencia / reversión / limpieza después de eliminar / otros que los motores de DB solucionan al permitir huecos).
fuente