gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:48:29 25 4
gpt4 key购买 nike

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

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

解决方法:

  1. 使用 select nextval('xxx_seq') 获取当前下一个值
  2. 从 yyyy 中选择 max(xxx_id)

它是给你自动增量 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

我使用的是 9.5.5 版本的数据库。

最佳答案

TL;DR:这不是错误。

通过列可以将 nextval(sequence_name) 作为它们的默认值这一事实,表链接到序列。

默认子句意味着当值已由 INSERT 或 COPY 提供时,此 nextval(...) 表达式不会被求值,序列也不会递增。这就是当你玩垃圾游戏时会发生的事情。

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

关于postgresql - 在 PostgreSQL 转储/恢复中,自动增量序列重复违反约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44545678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com