我有一個'位置'表如下:

使用 API,如果我發送有效記錄,表將正常以索引1開始。如果我發送的東西由于表的約束(無效的外鍵、空欄位等)而不會被接受,那么表自然不會接受它,并且不會插入任何內容。但是,如果我發送另一條有效記錄,而不是 id 2,它將被索引為3,即使該表只有一條記錄并且沒有任何內容被洗掉。有沒有一種簡單的方法可以避免這種情況?
謝謝!
uj5u.com熱心網友回復:
考慮這種情況:您啟動事務并執行 INSERT。成功,分配 id 2。INSERT 但是同一事務中的后續查詢失敗,您必須回滾,包括成功的 INSERT。
與此同時,另一個會話也進行自己的插入,分配 id 3。該事務提交。現在,表中存在 id 為 3 的行,但沒有 id 為 2 的行。
你想怎么處理?
a) 阻止所有并發插入,直到您提交事務。這是確保僅使用連續值所必需的。
b) 將自動增量實作為一個不斷增長的未使用 id 值串列。應該允許串列增長到多少空間?
事實上,自動增量允許“間隙”或未使用的值是正常的。如果 INSERT 失敗,或者事務回滾,或者您稍后洗掉一行,則會在連續 id 值的序列中留下間隙。
為了效率,這是必要的妥協。自增值必須是唯一的,但它們不需要是連續的。它們不是行號。如果您需要保證 id 值是連續的,則必須犧牲系統中的其他內容,例如并發 INSERT。如果您洗掉一行,您會怎么做,您是否希望重新編號所有后續行?
有些人想要壓縮他們的 id 值,因為他們擔心它們會用完。我看到您的主鍵是 BIGINT UNSIGNED。
https://mariadb.com/kb/en/bigint/說:
無符號范圍是 0 到 18446744073709551615。
請記住,如果您從 0 開始自動遞增并每秒遞增 100 萬次,則 BIGINT UNSIGNED 將持續 18,446,744,073,709 秒,即超過 584,542 年。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474804.html
上一篇:PostmanPostRequest列找不到錯誤(JDBC/MYSQL/AWS)
下一篇:如何根據以下記錄洗掉記錄
