在常规场合,我的Django webapps会在M2M表上产生SQL错误。
每次结果都会将ID序列重置为现有行范围内的值。
该应用程序执行常规SQL查询,例如:
INSERT INTO "myapp_project" ("name") VALUES ('test1') RETURNING "myapp_project"."id"'
会导致错误,例如:
IntegrityError: duplicate key value violates unique constraint "myapp_project_pkey"
DETAIL: Key (id)=(29) already exists.
然后事实证明myapp_project_id_seq
指向旧ID号:
select currval('myapp_project_id_seq')
29
然后可以使用以下方法重置:
select setval('myapp_project_id_seq', (select max(id) from myapp_project))
但是,我无法解释为什么会这样。它通常发生在Django的M2M表中。在这种情况下,只有admin-only输入的普通表。有人可以告诉我这个吗?
答案 0 :(得分:1)
这通常发生在您(或某人)有时明确地将值写入id
而不是从序列中获取值时(默认情况下或使用nextval()
)。
您的维修代码缺少一对括号。
SELECT setval('myapp_project_id_seq', (SELECT max(id) FROM myapp_project));
这是一个短暂的&在做同样的事情时更便宜,确切地说:
SELECT setval('myapp_project_id_seq', max(id)) FROM myapp_project;