Postgresql

如何修復序列中的所有重複鍵值?

  • March 6, 2022

我有一個使用 Django 應用程序創建的 Postgres 數據庫。當我將其轉移過來時,它從未重新索引任何內容,並且嘗試執行此操作時會出錯。似乎有很多表都有這個問題。有沒有辦法可以使用我在另一個問題上找到的程式碼並將其用於所有序列和表格?

SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)

您顯示的程式碼與“重新索引”無關。(比較:)REINDEX它通過使用setval()將其設置為現有的最大 ID,從而使serial列(或Postgres 10 或更高版本中的列)後面的序列重新同步。改為考慮:IDENTITY

SELECT setval('tablename_id_seq', max(id)) FROM tablename;

不需要子選擇,沒有要修復的錯誤(從序列返回的下一個值預設遞增)。但它對於空表失敗。還要涵蓋那個角落案例:

SELECT setval('tablename_id_seq'
           , COALESCE(max(id) + 1, 1)
           , false)
FROM   tablename;

或者更好的是,不提供序列名稱:

SELECT setval(pg_get_serial_sequence('tablename', 'id')
           , COALESCE(max(id) + 1, 1)
           , false)
FROM   tablename;

看:

除了@Erwin Brandstetter’s,我認為最大 id 應該是 +1。

SELECT setval(pg_get_serial_sequence('tablename', 'id'), max(id) + 1) FROM tablename;

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