2017-08-08 36 views
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; 

這不起作用,因爲執行第一次更新後,USER_ID被更新,從而爲預期的第二個SELECT語句不起作用。

回答

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; 
+0

感謝您的幫助。它很棒!這絕對讓我接觸到一些新的概念,我將不得不閱讀聚合函數,並試圖理解爲什麼這會起作用。 – galaxy233