Mysql

如何在 MySQL 和 PostgreSQL 中創建可辨識插入順序的自動增量列

  • July 10, 2022

我期待在 MySQL 數據庫上使用 AUTO_INCREMENT 索引,但找到了這個答案: https ://dba.stackexchange.com/a/306810/103306

一個警告,在這裡。在自動增量列中生成的值保證是唯一的,僅此而已。這些值不保證是連續的(連續執行,一個接一個),甚至總是增加。您不應以任何方式依賴這些值,除非它們彼此獨一無二。這引出了一個問題“您希望通過此活動實現什麼目標?”

我正在將一些東西移到 PostgreSQL,所以也檢查一下那裡的選項。找到序列類型:https ://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL

我知道值可能存在差距,並且可能不准確 1,2,3,4…n,但我不在乎差距。我需要知道的是 - 第一行插入了哪一行,之後插入了哪一行。

在 PostgreSQL 上,有另一個流行的答案建議使用“您自己的數據類型而不是串列”而不是串列,為什麼?它連結到有關沒有此類建議的序列類型的文件。

所以問題是 - 如何製作自動增量列來辨識 MySQL 和 PostgreSQL 中的插入順序?

使用 AWS RDS Aurora Serverless V2 Mysql v8.0.23 和 PostgreSQL v14.3

在存在兩個或多個並發會話的情況下,唯一反映插入順序的值是相應的時間戳。即使只有一個會話進行插入,序列(自動增量,串列,無論名稱如何)只是實際順序決定因素的代理,它仍然是插入時間戳。所以,使用時間戳。

所有 INSERT 必鬚髮生在單個設備上。該設備必鬚髮出序列號。

或者至少有一個設備“發布 id”。然後將 ID 交給那些需要插入的人,等等。

換句話說,如果沒有單一的 id 來源,就不可能進行排序。該單一來源必須僅使用單個執行緒(或具有足夠的鎖定來模擬此類)來分配 id。

請注意,在獲取 id 時,在 COMMIT 交易之前,您不得繼續執行其他任務。獲取交易中的 id。如果您以後必須“回滾”,那麼您必須接受您將在 id 中存在間隙。

當然,有“最終一致性”之類的東西,比如 NDB 的方式就是處理世界範圍內的一致性。但這對您的任務不起作用,除非您願意讓所有伺服器都簽到並且不抱怨。

由於網路延遲,讓所有客戶端與 NNTS 同步時鐘不起作用。同樣,您可以做“最終一致性”,但不能立即相信結果

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