【问题标题】:Auto increment issues postgresql自动增量问题 postgresql
【发布时间】:2014-06-10 19:09:58
【问题描述】:

在 postgresql 中遇到自动增量属性的一些问题

我创建了一个表说 emp

create table emp
( empid serial,
empname varcha(50),
primary key (empid)
);

我插入了一个 empid 为空白的值:

insert into emp (empname) values ('test1');

通过指定empid值进行下一次插入:

insert into emp (empid,empname) values (2,'test2');

现在,如果我下次插入一个值而不指定 empid 值,它会报错,因为它会尝试将 empid 插入为 2:

insert into emp (empname) values ('test3');

错误:重复键值违反唯一约束“emp_pkey”
详细信息:键 (empid)=(2) 已存在。

有人可以帮我解决这个问题,这样无论是否指定一个值,自动增量都应该选择 max(value) +1 ??

谢谢

【问题讨论】:

  • 这不是序列的工作方式。如果您希望它们自动工作,请不要为列指定值。
  • 有解决办法吗?问题是我在程序中有一些带有 empid 值的插入,无法删除......所以只是想检查是否有办法解决这个错误?
  • 不要与症状作斗争,解决问题:将代码更改为使用nextval() 或根本没有价值

标签: sql postgresql auto-increment


【解决方案1】:

您不能完全混合使用序列和固定 ID。在不使用序列的情况下插入值不会更新序列,因此会发生冲突。

如果您在批量加载阶段进行手动插入,或者您可以:

  • BEGIN

  • LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE

  • 做你的INSERTs

  • SELECT setval('seq_name', 14),将 14 替换为新的序列值。这可以是针对表的子查询。

  • COMMIT

...但总的来说,最好避免混合序列 ID 生成和手动分配的 ID。

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 2017-06-22
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多