2014-04-15 41 views
0

我有一個php函數使用mysql查詢UNIX_TIMESTAMP()來創建一個唯一的事務號,但是我發現如果函數在同一時間循環,它會爲Case 1生成相同的事務號,使用案例2不是一個巨大循環的好方法。如何用毫秒創建Mysql unix_timestamp

1.我使用的交易號是用於在表中列出相同的交易日期。

2.我的事務表使用UUID作爲PK,因爲數據跨越了數據庫。

慾望的答案就像下面和唯一。

TransNo = 1397533879.20290 

PHP 5.3版

MySQL版本5.5

例如函數循環3次

案例1:

SELECT UNIX_TIMESTAMP() as TransNo; 

Output : 
1397533879 
1397533879 
1397533879 

案例2:

SELECT UNIX_TIMESTAMP() as TransNo, SLEEP(1); 

Output : 
1397533879 
1397533880 
1397533881 
+1

爲什麼不在PHP中使用microtime? http://us2.php.net/microtime –

+0

Ohya,謝謝@Joshua Bixler,我忘了php有這個功能。但是,無論如何,mysql是否能夠做到這一點? –

+0

http://stackoverflow.com/questions/8979558/mysql-now-function-with-high-precision 不得不跳過版本5.6使用它看起來像。 –

回答

0

慾望答案是像下面的和獨特的。

TransNo = 1397533879.20290

如果你打電話current_timestampnow功能與microseconds部分精密,那麼他們返回timestamp,包括時間電流微秒。請注意,允許的最大精度僅適用於6數字。

參見上Fractional Seconds in Time Values

實施例1文檔:

select 
    @ts:=current_timestamp(3) cts_with_milli_seconds 
    , unix_timestamp(@ts) uts_with_ts_milli_seconds; 

結果1

+-------------------------+---------------------------+ 
| cts_with_milli_seconds | uts_with_ts_milli_seconds | 
+-------------------------+---------------------------+ 
| 2014-04-15 10:22:17.764 |   1397537537.764000 | 
+-------------------------+---------------------------+ 

實施例2

select 
    @nw:=now(6) now_with_milli_seconds 
    , unix_timestamp(@nw) uts_with_nw_milli_seconds; 

結果2

+----------------------------+---------------------------+ 
| now_with_milli_seconds  | uts_with_nw_milli_seconds | 
+----------------------------+---------------------------+ 
| 2014-04-15 10:22:17.789248 |   1397537537.789248 | 
+----------------------------+---------------------------+ 

旁註
如果仍然微秒部分也很相配,那麼你就可以追加RAND()你的價值觀。

RAND()的使用將不保證排序順序。因此,除非你只需要一個獨特的輸出,不要使用它。

+0

感謝@Ravinder,我使用的是由Joshua Bixler提供的php microtime(),它的結果爲1397537683.3391,1397537683.3429,1397537683.3456,它可以解決我的排序問題,如果使用RAND()不能保證順序插入。 –

+0

'RAND()'建議是在微件匹配的情況下。是的,在使用上,排序可能會失敗。否則,我的答案與推薦信息中的內容一樣有幫助。 –