Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ich einen eindeutigen TIMESTAMP für jeden Datensatz in MySQL erhalten?

Eines Tages (5.6.4) wird MySQL Bruchzahlen bereitstellen Sekunden In TIMESTAMP-Spalten sind jedoch nicht einmal Bruchteile von Sekunden garantiert eindeutig, obwohl sie theoretisch meistens eindeutig wären, insbesondere wenn Sie MySQL auf einen einzelnen Thread beschränken.

Sie können eine UUID verwenden wenn Sie eine eindeutige Nummer benötigen, die zeitlich geordnet ist.

SELECT UUID() ergibt so etwas wie:

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

Und einige Zeit später:

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

Die ersten drei Teile einer UUID bestehen aus der Zeit, sie sind jedoch von der höchsten zur niedrigsten Genauigkeit geordnet, also müssten Sie die ersten drei Teile mit SUBSTR() umkehren und CONCAT() so:

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

Ausbeuten:

11e1-8f00-45f9b8d6

Sie könnten eine Funktion wie diese natürlich nicht als Standardwert verwenden, also müssten Sie sie im Code festlegen, aber es ist ein garantiert eindeutiger zeitlich geordneter Wert. UUID() arbeitet auf einer viel niedrigeren Ebene als Sekunden (Taktzyklen), daher ist es bei jedem Aufruf garantiert eindeutig und hat einen geringen Overhead (kein Sperren wie auto_increment).

Die Verwendung der UUID() auf dem Datenbankserver kann der Verwendung einer ähnlichen Funktion vorgezogen werden, wie z. B. microtime() von PHP Funktion auf dem Anwendungsserver, da Ihr Datenbankserver stärker zentralisiert ist. Möglicherweise haben Sie mehr als einen Anwendungsserver (Webserver), der möglicherweise kollidierende Werte generiert, und microtime() garantiert immer noch keine eindeutigen Werte.