2014-08-28 40 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;