簡體   English   中英

僅當相同值的列不存在時,Postgres 才更新列

[英]Postgres update column only if column of same value does not exist

我需要對我的數據庫的連接表中的某些列進行簡單的更新操作,但是,如果具有更新值的列已經存在,我不想進行更新。

所以說連接表看起來像這樣:

_id | fkId
----------
1   | A
1   | B
2   | B
3   | C
3   | B
4   | A
  • 我想將所有具有BfkId的條目更新為A
  • 但是,每個條目都必須是唯一的,所以如果我已經有另一個條目相同的_id已經設置為fkId A ,那么我不想進行更新,而只是擺脫它

我的更新目前如下所示:

  UPDATE my_table
  SET "fkId"='A'
  WHERE "fkId"='B';

在我上面的示例表中,您會看到_id 1的條目,因此如果我運行此查詢,我最終會得到兩個條目

_id | fkId
----------
1   | A
1   | A

想要這個。 每對都必須是唯一的,因此必須將其刪除。 我怎樣才能通過查詢發生這種情況?

另外使用not exists條件:

UPDATE my_table AS t
  SET "fkId"='A'
  WHERE "fkId"='B' AND NOT EXISTS (
    SELECT 1 from my_table WHERE _id=t._id AND "fkId" = 'A');

然后,如果您想刪除未更新的行 - 只需執行以下操作:

DELETE FROM my_table WHERE "fkId" = 'B';

為了避免這兩個查詢之間的並行會話的干預,您可能需要在之前鎖定行:

SELECT * FROM my_table WHERE "fkId" = 'B' FOR UPDATE;

所以你的整個語句序列可能是:

BEGIN;
SELECT * FROM my_table WHERE "fkId" = 'B' FOR UPDATE;
UPDATE my_table AS t
  SET "fkId"='A'
  WHERE "fkId"='B' AND NOT EXISTS (
    SELECT 1 from my_table WHERE _id=t._id AND "fkId" = 'A');
DELETE FROM my_table WHERE "fkId" = 'B';
COMMIT;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM