如何在 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 完成它的工作。
相关主题:
我想 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 完成它的工作。
相关主题: