Postgresql
PostgreSQL 中的 UPDATE-SELECT 查詢如何鎖定表?
是否可以組合這些 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
分支)。不過,您的三個單獨的陳述對我來說看起來更清晰/更具可讀性。