【发布时间】:2014-10-22 15:29:47
【问题描述】:
我的 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 表上。在这种情况下,只有管理员输入的普通表。有人能告诉我吗?
【问题讨论】:
-
您几乎可以肯定在某处手动插入 id。我不能说,但那是你应该开始寻找的地方。
-
有趣。 @RichardHuxton:插入 ID 是否也会导致序列重置?或者这是否意味着它以前搞砸了?
-
没有发生的事情是您使用序列插入第 1,2,3 行,然后手动执行 4,5。下一个自动生成的 id 将是 4,因为它不知道你做了什么。这给出了一个错误。
标签: django postgresql django-models django-database