在 ON CONFLICT UPDATE 的 INSERT 值列表中使用额外的列
Use extra columns in INSERT values list in ON CONFLICT UPDATE
我有一个 UPSERT 查询,我想在列 b
中插入值 y
值,但如果它已经存在,我想用值 z
.[= 更新它14=]
INSERT INTO test (a,b)
select P.x,P.y
from (VALUES
('123', 4, 5),
('345', 2, 2)
) K(x,y,z)
ON CONFLICT (a) DO UPDATE
SET b = K.z;
我怎样才能做到这一点?
P.S:一个简单的值列表(没有 select)不起作用,因为值列表中的列数不能超过我们插入的列数。
在SET
部分,只能通过excluded
记录引用目标table的列和对应的“值”。他们都没有名为 z
的列
我能想到的唯一方法是将值放入 CTE 并通过子查询访问列 z
:
with data (x,y,z) as (
VALUES
(123, 4, 6),
(345, 2, 3)
)
INSERT INTO test (a,b)
select d1.x, d1.y
from data d1
ON CONFLICT (a) DO UPDATE
SET b = (select d2.z from data d2 where d2.x = excluded.a);
以上假定 a
是 table 的主(或唯一)键。
我有一个 UPSERT 查询,我想在列 b
中插入值 y
值,但如果它已经存在,我想用值 z
.[= 更新它14=]
INSERT INTO test (a,b)
select P.x,P.y
from (VALUES
('123', 4, 5),
('345', 2, 2)
) K(x,y,z)
ON CONFLICT (a) DO UPDATE
SET b = K.z;
我怎样才能做到这一点?
P.S:一个简单的值列表(没有 select)不起作用,因为值列表中的列数不能超过我们插入的列数。
在SET
部分,只能通过excluded
记录引用目标table的列和对应的“值”。他们都没有名为 z
我能想到的唯一方法是将值放入 CTE 并通过子查询访问列 z
:
with data (x,y,z) as (
VALUES
(123, 4, 6),
(345, 2, 3)
)
INSERT INTO test (a,b)
select d1.x, d1.y
from data d1
ON CONFLICT (a) DO UPDATE
SET b = (select d2.z from data d2 where d2.x = excluded.a);
以上假定 a
是 table 的主(或唯一)键。