【问题标题】:PostgreSQL sequence being reset?PostgreSQL 序列被重置?
【发布时间】: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


【解决方案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;

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2022-12-07
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多