如何修复所有重复的键值违反唯一约束

Lew*_*aws 1 postgresql sequence identity django

我有一个用 Django 应用程序创建的 Postgres 数据库。当我转移它时,它从未重新索引任何内容,并且在尝试执行此操作时出现错误。似乎有很多表都有这个问题。有没有办法可以使用我在另一个问题中找到的这段代码并将其用于所有序列和表格?

SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 7

您显示的代码与“重新索引”无关。(比较:)REINDEX。它通过将serial列(或IDENTITYPostgres 10 或更高版本中的列)后面的序列重新同步 - 通过将其设置为最大现有 ID。请考虑以下查询:

SELECT setval('tablename_id_seq', max(id)) FROM tablename;
Run Code Online (Sandbox Code Playgroud)

不需要子选择,不需要修复一个错误(默认情况下,从序列返回的下一个值会增加)。
或者,更好的是,您不必提供序列的名称:

SELECT setval(pg_get_serial_sequence('tablename', 'id'), max(id)) FROM tablename;
Run Code Online (Sandbox Code Playgroud)

细节: