En dag snart (5.6.4) kommer MySQL att tillhandahålla fraktionell sekunder i TIMESTAMP-kolumner är dock inte ens bråkdelar garanterat unika, men teoretiskt sett skulle de oftast vara unika, särskilt om du begränsar MySQL till en enda tråd.
Du kan använda ett UUID om du behöver ett unikt nummer som beställs temporärt.
SELECT UUID()
ger något i stil med:
45f9b8d6-8f00-11e1-8920-842b2b55ce56
Och en tid senare:
004b721a-8f01-11e1-8920-842b2b55ce56
De första tre delarna av ett UUID består av tiden, men de är i ordning från högsta precision till minsta, så du måste vända de tre första delarna med SUBSTR()
och CONCAT()
så här:
SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4),
'-', SUBSTR(UUID(), 1, 8))
Avkastning:
11e1-8f00-45f9b8d6
Du kunde uppenbarligen inte använda en funktion som denna som standardvärde, så du måste ställa in den i kod, men det är ett garanterat unikt tidsbestämt värde. UUID() fungerar på en mycket lägre nivå än sekunder (klockcykler), så det är garanterat unikt med varje samtal och har låg overhead (ingen låsning som auto_increment).
Att använda UUID() på databasservern kan vara att föredra framför att använda en liknande funktion, som PHP:s microtime()
funktion på applikationsservern eftersom din databasserver är mer centraliserad. Du kan ha mer än en applikationsserver (webbserver), vilket kan generera kolliderande värden, och microtime() garanterar fortfarande inte unika värden.