创建一个test表
create table test
(
id integer default nextval('test_id_seq'::regclass) not null
constraint test_pk
primary key,
c1 integer
);
插入数据
insert into test (c1) values (1);
insert into test (c1) values (2);
insert into test (c1) values (3);
发现自增ID是生效的,查看当前序列值为3
select currval('test_id_seq');
# 3
手动添加数据
手动添加数据后,当前序列值依然为3
select currval('test_id_seq');
# 3
再次插入数据
insert into test (c1) values (6);
insert into test (c1) values (7);
可以发现自增第一条数据插入成功,第二条数据则会抛出以下错误
[23505] ERROR: duplicate key value violates unique constraint "test_pk" 详细:Key (id)=(5) already exists.
原因分析
(id)=(5)
的数据使我们手动添加的,自增序列test_id_seq
没有自动增加,所以当自增序列test_id_seq
累加到5的时候主键就冲突了,在实际生产环境要尽量避免手动添加数据
当然也是有解决办法的,将自增序列test_id_seq
的当前值设置为当前id
的最大值即可
select setval('test_id_seq', 5);
重新执行:
insert into test (c1) values (7);
结果: