2011-12-25 20 views
7

Supongamos que tengo la mesa:MySQL: ¿puede un AUTO_INCREMENT generar valores fuera de servicio?

CREATE TABLE test (
    ID INT AUTO_INCREMENT PRIMARY KEY, 
    InsertTime DATETIME 
) ENGINE = InnoDB; 

Y, a través de una página web Apache/PHP, como respuesta a las peticiones web, sigo haciendo esto:

INSERT INTO test (InsertTime) values (NOW()); 

¿Es seguro asumir que si row1.ID > row2.ID entonces row1.InsertTime >= row2.InsertTime? O tal vez a través de una desafortunada combinación de factores (servidor multi-CPU en un entorno replicado con las lunas de Júpiter en la alineación correcta, etc.) ¿esto puede fallar?

Nota: No tengo ningún problema. Estoy escribiendo una nueva pieza de software y me pregunto si puedo confiar en ordenar por ID para ordenar también por fechas (solo NOW() incluso se insertará en esa columna).

+1

Esto no parece ser un problema, sino más bien una discusión por lo que -> más algo para los programadores de SE? Y para él, no veo cómo esto puede fallar. –

+2

@saratis - ¿No ves cómo esto es una discusión? Es una pregunta específica. O funciona 100% garantizado o no funciona. –

+0

Aunque supongo que hay 2 preguntas diferentes aquí. "¿Se puede generar un identificador a partir del pedido de inserción" y "¿es posible que la orden no coincida con el orden de la columna de fecha y hora?" –

Respuesta

2

creo que la mayoría de los problemas vendrán de la llamada a NOW() en lugar de AUTO_INCREMENT. ¡Sospecho que la mayoría de las computadoras en algún momento imprimen las fechas de NOW() fuera de servicio! Esto suele ser porque un administrador del sistema cambió el reloj o porque NTP cambió el reloj.

+0

Guau, no había pensado en el NTP. ¡Es tan obvio ahora! Y también significa que la clasificación de mi ID no solo es posible, ¡es muy recomendable! Porque es la única forma de garantizar que los registros se recuperen en el mismo orden en que se insertaron. –

2

creo que va a tener alguna inconsistencia una vez al año a causa del horario de verano (sin duda, depende de la configuración del servidor). Aparte de eso, no veo por qué puede fallar.

+0

A menos que esté haciendo una comparación de cadenas en lugar de una comparación de fechas, el horario de verano no causará un cambio de orden de fecha. Las marcas de tiempo se almacenan como UTC debajo del capó. MySQL sabe que a las 8:00 p.m. en UTC-7 es menor a las 7:01 p.m. en UTC-8. –

+0

En el ejemplo anterior utilizo el tipo 'datetime' de MySQL que no usa UTC ni ningún tipo de marcas de tiempo. En cambio, almacena la fecha como una cadena (bueno, casi). Así es como puedes lograr todas esas fechas inválidas como '00-00-0000'. Tampoco dice nada sobre las zonas horarias, así que tengo que hacer un seguimiento de eso yo mismo. Con todo, supongo que TIMESTAMP sería una opción mucho mejor. –

+0

Ah, y eso también significa que debido al horario de verano puede haber confusión de tiempo durante las transiciones. Una razón más para evitar ese tipo de datos. –

0

Es posible si alguien restablece manualmente el AUTO_INCREMENT sobre la mesa.

+0

Eso no es parte del funcionamiento normal. También podría introducir la fecha del manual en lugar de 'AHORA()'. Obviamente, si haces algo así, todas las apuestas están apagadas. –

1

mejor que puedo decir, el ID de incremento automático nunca dejará de devolver registros en el orden equivocado. Sin embargo, hay otro caso que debe tener en cuenta al hacer el pedido por ID.

Si su cliente nunca se aferra a los registros que debe colocarse posteriormente, a continuación, cuando se leen los registros, que no se leerá en el mismo orden creado. Me he encontrado con esto varias veces, por ejemplo, al crear clientes para aplicaciones móviles que tienen acceso intermitente a la red.

+0

Interesante, aunque en realidad no es mi caso. Digno de voto positivo de todos modos. :) –

0

Sí, elimine la columna AUTO_INCREMENT, a continuación, volver a crear una nueva.

+1

Ver mi comentario a [la respuesta del bloqueador] (http://stackoverflow.com/a/8630149/41360). –

Cuestiones relacionadas