我发现了一个有趣的错误,重要的是带有psql的postgresql转储文件:
如果你的表有一个sequence(auto increment field)
,例如在导入nextque序列之前是10,导入之后我们添加100行,逻辑上nextvalue必须是111. 但它仍然是11 ,当然,您将在下一次插入时遇到约束违规。
解决方法:
select nextval('xxx_seq')
select max(xxx_id) from yyyy
它给你自动增量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。
答案 0 :(得分:0)
TL; DR:这不是一个错误。
表格通过列可能有nextval(sequence_name)
作为默认值来链接到序列。
默认子句表示当INSERT或COPY已经提供了值时,不会计算此nextval(...)
表达式,并且序列不会递增。这就是你玩转储时会发生的事情。
在一般情况下,此类列创建为SERIAL
,转储文件包含相应序列的setval
,以便在加载后调整它们。您的案例与创建表格的方式或传递给pg_dump
的选项有所不同,但这些详细信息不会出现在问题中。