为什么插入主键不会影响序列?

时间:2018-06-11 06:02:14

标签: postgresql primary-key postgresql-9.5

当插入具有隐式主键的行时,它似乎不会影响主键序列,然后,当尝试在没有PK的情况下插入时,它会失败:

create table testtable(
  id serial primary key,
  data integer not null
);

使用PK插入(例如,在数据迁移时):

insert into testtable ( id, data ) values ( 1,2 ), ( 2,2 ), ( 3,2 ), ( 4,2 );
INSERT 0 4

在没有PK的情况下插入新数据:

insert into testtable ( data ) values ( 4 ), ( 5 ), ( 6 ), ( 7 );
ERROR:  duplicate key value violates unique constraint "testtable_pkey"
DETAIL:  Key (id)=(1) already exists.

为什么在第一个INSERT之后没有在最大值上设置序列?插入PK后我应该控制序列吗?有没有办法让序列自动在正确的轨道上?

1 个答案:

答案 0 :(得分:3)

此行为的原因是在列的DEFAULT值中访问序列,并且在显式插入列时不使用默认值。

实现你想要的唯一方法我想象的是在插入后有一个修改序列的触发器,但我认为这将是一个缓慢而可怕的解决方案。

最好的方法是在完成迁移后调整序列一次。