[英]Postgres UPDATE..FROM query with multiple updates on the same row
我正在嘗試使用UPDATE..FROM語法從值列表更新來優化Postgres中的批量UPDATE語句。 除了在同一查詢中同一行可能被多次更新之外,其他方法均有效。
例如說我有一個表“ test”,其中有“ key”和“ value”列。
update test as t set value = v.value from (values
('key1', 'update1'),
('key1', 'update2') )
as v (key, value)
where t.key = v.key;
我想要的行為是將鍵“ key1”的行更新兩次,最后將值設置為“ update2”。 實際上,有時將值更新為update1,有時更新為update2。 此外,表上的更新觸發函數僅被調用一次。
該文檔( http://www.postgresql.org/docs/9.1/static/sql-update.html )解釋了以下原因:
當存在FROM子句時,本質上是將目標表連接到from_list中提到的表,並且連接的每個輸出行都代表目標表的更新操作。 使用FROM時,應確保該聯接為要修改的每一行最多產生一個輸出行。 換句話說,目標行不應與其他表的多個行連接。 如果是這樣,那么將僅使用聯接行之一來更新目標行,但是將很難預測將使用哪一行。
由於存在這種不確定性,因此僅在子選擇內引用其他表會更安全,盡管與使用聯接相比,通常更難閱讀,也更慢。
有什么方法可以重新構造此查詢以實現我想要的行為? 文檔中對子選擇的引用是否有提示?
示例(假設id是目標表中的PK,而{id,date_modified}是源表中的PK)
UPDATE target dst
Set a = src.a , b = src.b
FROM source src
WHERE src.id = dst.id
AND NOT EXISTS (
SELECT *
FROM source nx
WHERE nx.id = src.id
-- use an extra key field AS tie-breaker
AND nx.date_modified > src.date_modified
);
(實際上,這是源表的重復數據刪除->強制源表與目標表具有相同的PK)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.