如何在PostgreSQL中更新或插入

问题描述

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

这样创建表

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;

谢谢:)

解决方法

我不确定我的用例是否正确。 PostgreSQL中的更新完全符合您的描述:

考虑此表和记录

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)

编辑(请参见注释):这是serial列的预期行为,因为它们不过是使用sequences的理想方式。长话短说:使用{sup {3}}。如果您担心该值可能太大,请改用bigserial并让PostgreSQL完成它的工作。

相关问题:the gaps will be inevitable