[英]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
B
的fkId
的條目更新為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.