2012-04-25 12 views
5

C'è la possibilità di ottenere un valore di timestamp unico per per ogni record in MySQL ?? ..Posso avere una data e un'ora univoci per ogni record in MySQL

ho creato una tabella di esempio

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

ed eseguito alcuni INSERTION di esempio e sembra che i valori di timestamp siano duplicati.

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

A meno che non si impedisca l'inserimento di record nello stesso momento, è possibile che siano presenti timestamp duplicati. –

+1

@MichaelMior Non è possibile aumentare la "sensibilità del TIMESTAMP" ?? .. utilizzando millisecondi ecc.? Marcus Solo utilizzando una query di selezione. a occhio nudo posso vederlo. –

+0

MySQL non supporta microsecondi (ancora, 5.6.4 sarà) quindi suggerirei di andare con un campo intero. – Kostis

risposta

6

Un giorno presto (5.6.4), MySQL fornirà fractional seconds in colonne timestamp, però, anche le frazioni di secondo non sono garantiti per essere unico, anche se in teoria, avrebbero più spesso sono unici, specialmente se hai limitato MySQL a un singolo thread.

È possibile utilizzare un UUID se è necessario un numero univoco ordinato temporalmente.

SELECT UUID() cede qualcosa come:

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

e qualche tempo dopo:

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

I primi tre porzioni di un UUID sono costituiti parte del tempo, però, sono in ordine dalla massima precisione per lo meno, quindi è necessario invertire le prime tre porzioni utilizzando SUBSTR() e CONCAT() in questo modo:

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

Resa:

11e1-8f00-45f9b8d6 

È, ovviamente, non poteva usare una funzione come questa come valore di default, in modo che ci si deve impostare nel codice, ma è un valore temporalmente ordinato unica garantiti. UUID() funziona a un livello molto inferiore rispetto a secondi (cicli di clock), quindi è garantito unico per ogni chiamata e ha un sovraccarico basso (nessun blocco come auto_increment).

Utilizzando l'UUID() sul server di database può essere preferibile utilizzare una funzione simile, come ad esempio la funzione microtime() di PHP sul server di applicazione perché il server di database è più centralizzata. Potresti avere più di un server di un'applicazione (web), che potrebbe generare valori di collisione, e microtime() continua a non garantire valori univoci.

+0

+1 ottime informazioni. Poche domande tuttavia sono sorte. In che modo i primi tre numeri garantiscono l'ordine temporale? Il manuale dice solo vagamente: "I primi tre numeri sono generati da un timestamp". Dovrebbe essere sempre usato l'intero UUID (solo i primi tre valori invertiti per l'ordine)? Dove trovare maggiori informazioni su questa funzione. Manuale non ha menzionato l'ordine di "massima precisione al minimo"? –

+0

@ ZZ-bb, il manuale MySQL non include i dettagli perché il formato UUID che usano è un [standard] (http://pubs.opengroup.org/onlinepubs/9629399/toc.pdf). La quarta parte dell'UUID cambierà ogni volta che si imposta l'orologio indietro. Questo per garantire che il valore nel suo complesso sia unico. Finché non si scherza con l'orologio, le prime tre parti vanno bene. –

2

Sì se non fai due o più inserti o modifiche durante un secondo. L'unico problema è che molte cose possono essere fatte durante un secondo, cioè più inserti o aggiornamenti automatici usando una clausola where. Ciò esclude la soluzione semplice per imporre timestamp univoci: per aggiungere il vincolo unique nella colonna timestamp.

Perché un timestamp deve essere univoco? Utilizzare auto increment o qualcos'altro se avete bisogno di indice univoco ecc

Se avete bisogno di valori di tempo più precise rispetto timestamp, vedi:

+0

grazie per la risposta descrittiva. L'incremento automatico non funzionerà per il mio problema. Da quando è stata eseguita una query di aggiornamento. Quindi non riesco a rilevare l'ordine dei record sono cambiati. Ecco perché ho provato a usare un TIMESTAMP. –

+0

@'Ashan Quando si inseriscono i record "AI" rielabora l'ordine. Ma il montaggio è una storia diversa. Perché modificare l'ordine conta? Credo che la funzione principale di 'timestamp' è quella di segnare il momento in cui le modifiche apportate in una riga in modo da sapere che la riga ha o non è cambiata dopo l'inserimento. Non rivelare l'ordine dei cambiamenti. Memorizzare 'microtime' in alcune colonne potrebbe essere una risposta, ma non credo che ci sia alcuna garanzia che anche quel valore sia sempre unico. Puoi inserire 'date' o' timestamp' + una sorta di valore di conteggio delle modifiche della data corrente. Ma poi di nuovo, come tenere traccia delle modifiche? –

Problemi correlati