从问题中可以清楚地看出,您提供的代码不是您拥有的确切代码。正如您所描述的,由于您在没有传递id 的情况下插入,因此您的实际代码大概如下所示:
insert into yourtable(name, age)
values(' xyz ', 21)
on conflict(id) do
update set name='new_name',age='new_age';
由于您没有传递id,因此您将永远不会有conflict,因此将插入所有内容。为了处理conflict,您需要了解id 并执行以下操作:
insert into yourtable(id, name, age)
values(1, ' xyz ', 21)
on conflict(id) do
update set name='new_name',age='new_age';
很明显,您不一定知道记录的 id 是什么,但这是一个算法问题。您需要找出id 是什么。
请看https://www.postgresqltutorial.com/postgresql-upsert/
它有一个例子:
INSERT INTO customers (name, email)
VALUES('Microsoft','hotline@microsoft.com')
ON CONFLICT (name)
DO
UPDATE SET email = EXCLUDED.email || ';' || customers.email;
表定义为
DROP TABLE IF EXISTS customers;
CREATE TABLE customers (
customer_id serial PRIMARY KEY,
name VARCHAR UNIQUE,
email VARCHAR NOT NULL,
active bool NOT NULL DEFAULT TRUE
);
请注意name 是unique,因此,如果insert 尝试添加已存在name 的记录,则该命令在conflict 中与该记录一起,这将是更新。如果您不提供id,那么您的命令将不会有任何冲突并且不会更新,而是insert 所有记录。