在PostgreSQL转储/恢复中,自动增量序列重复违规约束

时间:2017-06-14 13:05:21

标签: postgresql constraints restore dump

我发现了一个有趣的错误,重要的是带有psql的postgresql转储文件:

如果你的表有一个sequence(auto increment field),例如在导入nextque序列之前是10,导入之后我们添加100行,逻辑上nextvalue必须是111. 但它仍然是11 ,当然,您将在下一次插入时遇到约束违规。

解决方法:

  1. 使用select nextval('xxx_seq')
  2. 获取当前下一个值
  3. select max(xxx_id) from yyyy
  4. 它给你自动增量id的最大当前值。

    现在我们需要将下一个值设置为2)+ 1:

    SELECT setval('xxx_seq', n+1, true)
    

    转储到文件中:

    pg_dump --data-only -h host -p port -U username -a  dbname > outputfilename
    

    恢复转储:

    psql -h host -U username dbname < outputfilename
    

    我使用db版本9.5.5。

1 个答案:

答案 0 :(得分:0)

TL; DR:这不是一个错误。

表格通过列可能有nextval(sequence_name)作为默认值来链接到序列。

默认子句表示当INSERT或COPY已经提供了值时,不会计算此nextval(...)表达式,并且序列不会递增。这就是你玩转储时会发生的事情。

在一般情况下,此类列创建为SERIAL,转储文件包含相应序列的setval,以便在加载后调整它们。您的案例与创建表格的方式或传递给pg_dump的选项有所不同,但这些详细信息不会出现在问题中。