Postgresql

CURRENT_TIMESTAMP 可以用作 PRIMARY KEY 嗎?

  • August 6, 2018

可以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()

引用自:https://dba.stackexchange.com/questions/214110