切换两行的外键

时间:2017-08-08 20:34:06

标签: database postgresql massive

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

我的物品' 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语句不能按预期工作。

1 个答案:

答案 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;