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.
A meno che non si impedisca l'inserimento di record nello stesso momento, è possibile che siano presenti timestamp duplicati. –
@MichaelMior Non è possibile aumentare la "sensibilità del TIMESTAMP" ?? .. utilizzando millisecondi ecc.? Marcus Solo utilizzando una query di selezione. a occhio nudo posso vederlo. –
MySQL non supporta microsecondi (ancora, 5.6.4 sarà) quindi suggerirei di andare con un campo intero. – Kostis