Django 正在重置PostgreSQL序列?
我的Django webapps经常在M2M表上产生SQL错误 每次都会将ID序列重置为现有行范围内的值 该应用程序执行常规SQL查询,例如:Django 正在重置PostgreSQL序列?,django,postgresql,django-models,django-database,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:
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.
这会导致错误,例如:
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\u project\u id\u seq
指向一个旧的id号:
select currval('myapp_project_id_seq')
29
然后可以使用以下方法重置:
select setval('myapp_project_id_seq', (select max(id) from myapp_project))
然而,我无法解释为什么会发生这种情况。它通常发生在Django中的M2M表上。在本例中,是一个只有管理员输入的普通表。有人能告诉我这一点吗?这通常发生在您(或某人)有时显式地将值写入
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;
您几乎肯定是在某个地方手动插入id。我不能说,但那是你应该开始寻找的地方。有趣@RichardHuxton:插入ID是否也会导致序列重置?或者这是否意味着它以前被搞砸了?不,现在发生的是使用顺序插入第1、2、3行,然后手动执行第4、5行。下一个自动生成的id将是4,因为它不知道您做了什么。这是一个错误。