2012-04-25 19 views
5

¿Existe la posibilidad de obtener un valor de marca de tiempo único para cada registro en MySQL ?? ..¿Puedo obtener un TIMESTAMP único para cada registro en MySQL

he creado una tabla de ejemplo

CREATE TABLE t1 (id int primary key, name varchar(50), 
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); 

y ejecutó algunos ejemplos de INSERCIONES y parece que los valores de la marca de tiempo están duplicados.

e.g insert into t1(id,name) values(1,"test"); 
+3

A menos que evite que se inserten registros al mismo tiempo, puede haber marcas de tiempo duplicadas. –

+1

@MichaelMior ¿No puedo aumentar la "sensibilidad TIMESTAMP" ?? .. usando milisegundos, etc.? Marcus Just Usando una consulta Select. a simple vista puedo verlo. –

+0

MySQL no admite microsegundos (sin embargo, 5.6.4 lo hará), por lo que sugeriría ir con un campo entero. – Kostis

Respuesta

6

Algún día (5.6.4), MySQL proporcionará fractional seconds en las columnas de fecha y hora, sin embargo, incluso fracciones de segundo, no se garantiza que sea único, aunque teóricamente, tendrían más a menudo ser único, especialmente si limita MySQL a un solo hilo.

Puede usar un UUID si necesita un número único que se solicite temporalmente.

SELECT UUID() produce algo así como:

45f9b8d6-8f00-11e1-8920-842b2b55ce56 

y algún tiempo después:

004b721a-8f01-11e1-8920-842b2b55ce56 

Los primeros tres porciones de un UUID consisten en el tiempo, sin embargo, están en orden de mayor precisión al menos, por lo que necesitaría invertir las tres primeras porciones usando SUBSTR() y CONCAT() así:

SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4), 
    '-', SUBSTR(UUID(), 1, 8)) 

Rendimiento:

11e1-8f00-45f9b8d6 

Obviamente no podría utilizar una función como esta como un valor por defecto, por lo que tendría para configurarlo en el código, pero es un valor único ordenado temporalmente garantizada. UUID() funciona a un nivel mucho más bajo que los segundos (ciclos de reloj), por lo que se garantiza que es único con cada llamada y tiene una sobrecarga baja (sin bloqueo como autoincremento).

El uso del UUID() en el servidor de la base de datos puede ser preferible al uso de una función similar, como la función microtime() de PHP en el servidor de aplicaciones porque el servidor de la base de datos está más centralizado. Es posible que tenga más de un servidor de aplicaciones (web), que puede generar valores colisionantes, y microtime() aún no garantiza valores únicos.

+0

+1 gran información. Sin embargo, surgieron pocas preguntas. ¿Cómo garantizan los tres primeros números el orden temporal? Manual dice simplemente vagamente: "Los tres primeros números se generan a partir de una marca de tiempo". ¿Debe usarse siempre el 'UUID' completo (solo los primeros tres valores invertidos para ordenar)? Dónde encontrar más información sobre esta función. Manual no mencionó el orden de "la más alta precisión al mínimo"? –

+0

@ ZZ-bb, el manual de MySQL no incluye los detalles porque el formato de UUID que usan es un [estándar] (http://pubs.opengroup.org/onlinepubs/9629399/toc.pdf). La cuarta parte del UUID cambiará cada vez que ajuste el reloj. Esto es para asegurar que el valor como un todo sea único. Siempre y cuando no te metas con tu reloj, las primeras tres partes están bien. –

2

Sí, si no hace dos o más inserciones o ediciones durante un segundo. El único problema es que se pueden hacer muchas cosas durante un segundo, es decir, varias inserciones o actualizaciones automáticas utilizando una cláusula where. Eso descarta la solución simple para forzar marcas de tiempo únicas: para agregar la restricción unique a la columna timestamp.

¿Por qué debería ser único timestamp? Utilice auto increment o algo más si necesita índice único etc.

Si necesita valores de tiempo más precisos que timestamp, consulte:

+0

gracias por la respuesta descriptiva. El incremento automático no funcionará para mi problema. Desde que se ejecutó una consulta de actualización. Entonces no puedo detectar el orden en que los registros han cambiado. Es por eso que traté de usar un TIMESTAMP. –

+0

@Ashan Al insertar registros, 'AI' rehace el orden. Pero editar es una historia diferente. ¿Por qué importar el orden es importante? Creo que la función principal de 'timestamp' es marcar el tiempo cuando los cambios se hacen en una fila para que sepa que la fila ha cambiado o no después de la inserción. No revelar el orden de los cambios. Almacenar 'microtime' en alguna columna podría ser una respuesta, pero no creo que haya ninguna garantía de que incluso ese valor sea siempre único. Puede insertar 'date' o' timestamp' + algún tipo de valor de conteo de las ediciones de la fecha actual. Pero, nuevamente, ¿cómo hacer un seguimiento de las ediciones? –

Cuestiones relacionadas