Postgresql

PostgreSQL 中的 UPDATE-SELECT 查詢如何鎖定表?

  • July 3, 2019

是否可以組合這些 UPDATE 查詢?

UPDATE myTable1 SET fld1 = myTable2.value
FROM myTable2
WHERE myTable1.id = myTable2.id AND myTable2.style = 45;
UPDATE myTable1 SET fld2 = myTable2.value
FROM myTable2
WHERE myTable1.id = myTable2.id AND myTable2.style = 46;
UPDATE myTable1 SET fld3 = myTable2.value
FROM myTable2
WHERE myTable1.id = myTable2.id AND myTable2.style = 47;

還有,這兩張表的鎖是怎麼回事?

a_horse_with_no_name在對問題的評論中解決了關於鎖的問題:

UPDATE 永遠不會鎖定表 - 它只會鎖定已更新的行(在目標表中)。選擇永遠不會鎖定任何行

至於將三個更新語句合二為一,是的,有可能,但不一定是個好主意。不過,如果您堅持,這裡有一種方法:

UPDATE
 myTable1
SET
 fld1 = CASE myTable2.style WHEN 45 THEN myTable2.value ELSE myTable1.fld1 END,
 fld2 = CASE myTable2.style WHEN 46 THEN myTable2.value ELSE myTable1.fld2 END,
 fld3 = CASE myTable2.style WHEN 47 THEN myTable2.value ELSE myTable1.fld3 END
FROM
 myTable2
WHERE
 myTable1.id = myTable2.id
 AND myTable2.style IN (45, 46, 47)
;

基本上,您進行連接,將三個過濾條件與一個IN謂詞結合起來,在三個分配中的每一個中,您使用一個CASE表達式來檢查值是否myTable2.style與過濾器中的相應值匹配,以便您可以決定是否myTable2.value將列(THEN分支)或保留舊值(ELSE分支)。

不過,您的三個單獨的陳述對我來說看起來更清晰/更具可讀性。

引用自:https://dba.stackexchange.com/questions/241183