如何在 PostgreSQL 中更新或插入

How to UPDATE or INSERT in PostgreSQL

我想 UPDATE or INSERT PostgreSQL 中的一列 而不是 使用 INSERT ... ON CONFLICT ...INSERT or UPDATE 因为会有更多更新多于插入,而且我有一个使用 SERIAL 定义的自动递增 id 列,因此它每次尝试 INSERT 或 UPDATE 时都会递增 id 列,这不是我想要的,我希望 id 列仅在以下情况下增加这是一个 INSERT,因此所有 ID 都将按顺序排列

table是这样创建的

CREATE TABLE IF NOT EXISTS table_name (
    id SERIAL PRIMARY KEY,

    user_id varchar(30) NOT NULL,
    item_name varchar(50) NOT NULL,
    code_uses bigint NOT NULL,

    UNIQUE(user_id, item_name)
)

我使用的查询是

INSERT INTO table_name
VALUES (DEFAULT, 'some_random_id', 'some_random_name', 1)
ON CONFLICT (user_id, item_name)
DO UPDATE SET code_uses = table_name.code_uses + 1;

谢谢:)

Upserts 在 PostgreSQL 中完全按照您的描述进行操作。

考虑这个table并记录

CREATE TABLE t (id SERIAL PRIMARY KEY, txt TEXT);
INSERT INTO t (txt) VALUES ('foo'),('bar');

SELECT * FROM t ORDER BY id;

 id | txt 
----+-----
  1 | foo
  2 | bar
(2 Zeilen)

使用 upserts id 只会在插入新记录时递增

INSERT INTO t VALUES (1,'foo updated'),(3,'new record')
ON CONFLICT (id) DO UPDATE SET txt = EXCLUDED.txt;

SELECT * FROM t ORDER BY id;

 id |     txt     
----+-------------
  1 | foo updated
  2 | bar
  3 | new record
(3 Zeilen)

EDIT(见评论):这是 serial 列的预期行为,因为它们只不过是使用 [=18= 的一种奇特方式].如果您担心该值可能会变得太大,请改用 bigserial 并让 PostgreSQL 完成它的工作。

相关主题: