Postgresql
CURRENT_TIMESTAMP 可以用作 PRIMARY KEY 嗎?
可以
CURRENT_TIMESTAMP
用作PRIMARY KEY
?是否有可能兩個或多個不同的 INSERT 得到相同的
CURRENT_TIMESTAMP
?
根據文件,精度
CURRENT_TIMESTAMP
為微秒。因此,碰撞的機率很低,但可能。現在想像一個很少發生並導致數據庫錯誤的錯誤。調試它有多難?這是一個比至少是確定性的錯誤更糟糕的錯誤。
更廣泛的背景:您可能希望避免這些與序列的細微差別,如果您習慣於 MySQL,這尤其令人討厭。
此外,如果您使用事務(大多數 Web 框架,尤其是 Java 框架,都這樣做!),那麼事務中的時間戳將是相同的!一個示範:
postgres=# begin; BEGIN postgres=# select current_timestamp; current_timestamp ------------------------------- 2018-08-06 02:41:42.472163+02 (1 Zeile) postgres=# select current_timestamp; current_timestamp ------------------------------- 2018-08-06 02:41:42.472163+02 (1 Zeile)
再見?兩次選擇,完全相同的結果。我打字不那麼快。;-)
–
如果您想要輕鬆的 ID,避免使用序列,則從記錄的真實標識符生成一些雜湊值。例如,如果您的數據庫中有人類,並且您知道他們的出生日期、母親的婚前姓氏和真實姓名可以唯一標識他們,那麼使用
md5(mother_name || '-' || given_name || '-' birthday);
作為身份證。除此之外,您可以
CreationDate
在索引表之後使用列,但它不是鍵(即 id)。Ps 一般來說,盡可能使您的數據庫具有確定性是一種非常好的做法。即相同的操作應該在數據庫中創建完全相同的更改。任何基於時間戳的 ID 都無法實現這一重要功能。如果你想調試或模擬任何東西怎麼辦?您重播一個操作,將創建具有不同 id 的同一個對象……這真的不難理解,而且節省了大量的工作時間。
Ps2 任何人在未來檢查您的程式碼,都不會因為上述原因看到時間戳生成的 id。
不是真的,因為 CURRENT_TIMESTAMP 可能為兩個後續 INSERT(或具有多行的單個 INSERT)提供兩個相同的值。
改用基於時間的 UUID:uuid_generate_v1mc()。