Postgresql转储是否创建以最后一个键开头或之后的序列?

时间:2010-06-17 03:22:27

标签: sql database postgresql django-models django-orm

我最近在Django项目后面创建了一个数据库的SQL转储,并且在清理了SQL之后,稍微能够恢复数据库和所有数据。问题是序列都被破坏了。我尝试添加新用户并生成Python错误IntegrityError: duplicate key violates unique constraint

当然,我认为我的SQL转储没有重启序列。但确实如此:

DROP SEQUENCE "auth_user_id_seq" CASCADE;
CREATE SEQUENCE "auth_user_id_seq" INCREMENT 1 START 446 MAXVALUE 9223372036854775807 MINVALUE 1 CACHE 1;
ALTER TABLE "auth_user_id_seq" OWNER TO "db_user";

我发现重复尝试创建用户(或任何表中包含现有数据和此类序列的任何新行)都允许成功创建对象/行。这解决了紧迫的问题。

但鉴于该表中的最后一个用户ID是446 - 上面的序列创建中的相同起始值 - 看起来Postgresql只是试图用该键开始创建行。

SQL转储是否提供错误的启动键1?或者我应该在给定的起始ID之后调用其他命令来启动序列?非常好奇。

1 个答案:

答案 0 :(得分:3)

转储很好,没问题。如果您的代码(或列的默认值)使用nextval()从序列中获取下一个值,那么一切也会正常。检查代码并查看它的作用,执行什么SQL。通过这些信息,您可以了解出现问题的原因。

祝你好运!