Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 正在重置PostgreSQL序列?_Django_Postgresql_Django Models_Django Database - Fatal编程技术网

Django 正在重置PostgreSQL序列?

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:

我的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.
这会导致错误,例如:

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,因为它不知道您做了什么。这是一个错误。