PostgreSQL BIGSERIAL 和插入时的“重复键”

Sod*_*aan 4 postgresql

我有一张桌子

CREATE TABLE users (
  id BIGSERIAL NOT NULL PRIMARY KEY,
  created_at TIMESTAMP DEFAULT NOW()
);
Run Code Online (Sandbox Code Playgroud)

首先我跑

INSERT INTO users (id) VALUES (1);
Run Code Online (Sandbox Code Playgroud)

我跑完之后

INSERT INTO users (created_at) VALUES ('2016-11-10T09:37:59+00:00');
Run Code Online (Sandbox Code Playgroud)

我得到

错误:重复的键值违反了唯一约束“users_pkey”详细信息:键(id)=(1)已存在。

为什么我自己插入“id”时id序列没有增加?

Lau*_*lbe 5

这是因为只有当您省略子句中的列或插入特殊值DEFAULT时,才会计算该子句。SETDEFAULT

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

不要将INSERTs 与使用序列的自动值创建和INSERT显式指定列的 s 混合在一起。或者,如果必须的话,您应该确保这些值不会发生冲突,例如,使用偶数作为自动生成的值,使用奇数作为显式生成的值INSERT。