插入时出现 PostgreSQL BIGSERIAL 和 "duplicate key"

标签 postgresql

我有一张 table

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');

我明白了

ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(1) already exists.

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

最佳答案

这是因为 DEFAULT 子句只有在您省略 SET 子句中的列或插入特殊值 DEFAULT 时才会被评估。

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

不要将 INSERT 与使用序列的自动值创建和显式指定列的 INSERT 混合使用。或者如果你必须这样做,你应该确保这些值(value)观不会发生冲突,例如通过对自动生成的值使用偶数,对显式 INSERT 使用奇数。

关于插入时出现 PostgreSQL BIGSERIAL 和 "duplicate key",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40586576/

相关文章:

可以使用 SYSDATE 的 SQL 确定性函数仍然可以建立索引吗?

python - 使用 sqlalchemy 的 row_to_json 语法

sql - 在两列上对 PostgreSQL 中的表进行排序,以便列 X 中的值等于前一条记录中列 Y 中的值

postgresql - PostgreSQL hstore 数组列上的索引

java - 两个连接的 JPQL 并集

ruby - ROR + 不同格式的 Ruby 日期

python - SQLAlchemy 与 Flask db.session.commit() 不起作用

c# - 每当更新数据库中的字段时调用外部 API

sql - 在两个日期之间取最小值时出错

postgresql - CMDBuild密码重置