Някой ден скоро (5.6.4) MySQL ще предостави дробни секунди в колоните TIMESTAMP обаче дори частични секунди не са гарантирани, че са уникални, макар че теоретично те най-често биха били уникални, особено ако сте ограничили MySQL до една нишка.
Можете да използвате UUID ако имате нужда от уникален номер, който е поръчан временно.
SELECT UUID()
дава нещо като:
45f9b8d6-8f00-11e1-8920-842b2b55ce56
И малко по-късно:
004b721a-8f01-11e1-8920-842b2b55ce56
Първите три части на UUID се състоят от времето, но те са подредени от най-висока точност до най-малко, така че ще трябва да обърнете първите три части, като използвате SUBSTR()
и CONCAT()
така:
SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4),
'-', SUBSTR(UUID(), 1, 8))
Добиви:
11e1-8f00-45f9b8d6
Очевидно не можете да използвате функция като тази като стойност по подразбиране, така че ще трябва да я зададете в код, но това е гарантирана уникална стойност, подредена във времето. UUID() работи на много по-ниско ниво от секунди (тактови цикли), така че е гарантирано уникален при всяко повикване и има ниски допълнителни разходи (без заключване като auto_increment).
Използването на UUID() на сървъра на базата данни може да бъде за предпочитане пред използването на подобна функция, като microtime()
на PHP функция на сървъра на приложения, защото вашият сървър на база данни е по-централизиран. Възможно е да имате повече от един сървър на приложения (уеб), който може да генерира сблъскващи се стойности, а microtime() все още не гарантира уникални стойности.