我正在一个用户可以与其他用户交换商品的网站上工作。交易完成后,我需要更改商品的所有者。
我的物品' table有一个引用用户的外键。给定两个项目ID,如何相互切换外键?
我尝试过这样的事情......
UPDATE items
SET user_id = (
SELECT users.id FROM items
INNER JOIN users
ON users.id = items.user_id
WHERE items.id = $1
)
WHERE id = $2;
UPDATE items
SET user_id = (
SELECT users.id FROM items
INNER JOIN users
ON users.id = items.user_id
WHERE items.id = $2
)
WHERE id = $1;
这不起作用,因为在执行第一个UPDATE之后,user_id被更新,因此第二个SELECT语句不能按预期工作。
答案 0 :(得分:1)
您应该在单个查询中执行此操作,使用with
语句。
pairs
查询将项目(作为参数提供)与用户链接,并通过以相反的顺序聚合链接值来切换链接值。
with params(param) as (
values ($1), ($2)
),
pairs(i_id, u_id) as (
select i_id, u_id
from (
select
array_agg(param order by user_id) as i_arr,
array_agg(user_id order by user_id desc) as u_arr
from items
join params on param = id
) s,
unnest(i_arr, u_arr) as u(i_id, u_id)
)
update items
set user_id = u_id
from pairs
where id = i_id;