PostgreSQL序列被重置?

时间:2014-08-28 17:12:10

标签: django postgresql django-models django-database

在常规场合,我的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输入的普通表。有人可以告诉我这个吗?

1 个答案:

答案 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;