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

4

我有一张表格

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”的重复键值 详细信息:键(id)=(1)已存在。

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

1个回答

5
那是因为在SET子句中,如果你省略了该列或插入了特殊值DEFAULT,则DEFAULT子句才会被评估。
在你的第一个INSERT语句中,DEFAULT子句未被评估,因此序列未增加。你的第二个INSERT语句使用了DEFAULT子句,序列增加并返回值1,这与先前INSERT中明确给定的值产生冲突。
不要混淆使用序列自动创建值的INSERT和显式指定列的INSERT。或者如果你必须这样做,你应该确保这些值不会发生冲突,例如使用偶数作为自动生成值的编号,奇数作为显式INSERT的编号。

最好您用一个例子来解释。 - Tejas Tank
@TejasTank 这个例子在问题中。 - Laurenz Albe

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