Mysql
 sql >> Database >  >> RDS >> Mysql

Posso ottenere un TIMESTAMP univoco per ogni record in MySQL

Un giorno presto (5.6.4), MySQL fornirà fractional secondi nelle colonne TIMESTAMP, tuttavia, non è garantito che anche i secondi frazionari siano unici, anche se in teoria sarebbero molto spesso unici, specialmente se si limita MySQL a un singolo thread.

Puoi utilizzare un UUID se hai bisogno di un numero univoco ordinato temporaneamente.

SELECT UUID() produce qualcosa come:

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

E qualche tempo dopo:

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

Le prime tre porzioni di un UUID sono costituite dal tempo, tuttavia, sono in ordine dalla massima precisione alla minima, quindi è necessario invertire le prime tre porzioni utilizzando SUBSTR() e CONCAT() così:

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

Rendimento:

11e1-8f00-45f9b8d6

Ovviamente non puoi usare una funzione come questa come valore predefinito, quindi dovresti impostarla nel codice, ma è un valore univoco garantito temporalmente ordinato. UUID() funziona a un livello molto più basso dei secondi (cicli di clock), quindi è garantito unico con ogni chiamata e ha un sovraccarico ridotto (nessun blocco come auto_increment).

L'utilizzo dell'UUID() sul server del database può essere preferibile all'utilizzo di una funzione simile, come microtime() di PHP funzione sul server delle applicazioni perché il server del database è più centralizzato. Potresti avere più di un server di applicazioni (web), che potrebbe generare valori in collisione e microtime() non garantisce ancora valori univoci.