2014-08-28 72 views
0

定期,我的Django webapps在M2M表上产生SQL错误。PostgreSQL序列被重置?

每次发现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表格上。在这种情况下,一个只有管理员输入的普通表。有人能为我提供这方面的启发吗?

+2

你几乎肯定将ID的手动地方。我不能说的地方,但那是你应该开始寻找的地方。 – 2014-08-28 17:58:20

+0

有趣。 @RichardHuxton:插入ID是否也会导致序列被重置?或者这是否意味着它被搞乱了? – vdboor 2014-08-29 15:34:48

+0

没有发生什么事是你插入行1,2,3使用序列然后手动做4,5。下一个自动生成的ID将是4,因为它不知道你做了什么。这给出了一个错误。 – 2014-08-29 16:55:55

回答

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;