PostgreSQL BIGSERIAL和"重复密钥"在插入

时间:2016-11-14 10:29:24

标签: postgresql

我有一张桌子

CREATE TABLE users (
  id BIGSERIAL NOT NULL PRIMARY KEY,
  created_at TIMESTAMP DEFAULT NOW()
);

首先我跑

INSERT INTO users (id) VALUES (1);

我跑完后

INSERT INTO users (created_at) VALUES ('2016-11-10T09:37:59+00:00');

我得到了

  

错误:重复键值违反了唯一约束" users_pkey"   DETAIL:Key(id)=(1)已经存在。

当我插入" id"为什么id序列不会递增?我自己?

1 个答案:

答案 0 :(得分:2)

这是因为如果您省略DEFAULT子句中的列或插入特殊值SET,则仅评估DEFAULT子句。

在您的第一个INSERT中,未评估DEFAULT子句,因此不会增加序列。您的第二个INSERT使用DEFAULT子句,序列增加并返回值1,该值与前一个INSERT中明确给出的值冲突。

不要使用明确指定列的序列和INSERTINSERT与自动值创建混合在一起。或者,如果必须,您应确保值不会发生碰撞,例如通过对自动生成的值使用偶数和为显式INSERT s使用奇数。