PostgreSQL自增问题

3
面对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) 的键已存在。

请问有人能帮我解决这个问题吗?即使没有指定值,自动增量也应该选择最大值+1吗?

谢谢。


3
这不是序列的工作方式。如果你想让它们自动工作,只需不指定该列的值即可。 - user330315
有什么解决方法吗?问题是我在程序中有一些带有empid值的插入,这些值不能被删除...所以只想检查是否有解决此错误的方法? - WinSupp
可能是[Autoincrement,但省略列中现有的值]的重复问题(http://stackoverflow.com/questions/22407444/autoincrement-but-omit-existing-values-in-the-column) - Daniel Vérité
2
不要对症下药,解决问题:更改您的代码以使用nextval()或根本不使用值。 - user330315
1个回答

3
您不能混合使用序列和固定ID,如果没有使用序列进行插入值,则不会更新序列,因此会出现冲突。如果您要在批量加载阶段或其他阶段进行手动插入,可以执行以下操作:
- BEGIN - LOCK TABLE the_table IN ACCESS EXCLUSIVE MODE - 执行INSERT操作 - SELECT setval('seq_name', 14),将14替换为新的序列值。这可以是对表的子查询。 - COMMIT
但一般来说,最好避免混合使用序列ID生成和手动分配的ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接