问题描述
我想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完成它的工作。