0

我正在一个用户可以与其他用户交易物品的网站上工作。交易完成后,我需要更改物品的所有者。

我的“项目”表有一个引用用户的外键。给定两个项目 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 语句没有按预期工作。

4

1 回答 1

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;
于 2017-08-08T21:19:11.180 回答