簡體   English   中英

Postgres UPDATE..FROM查詢在同一行上有多個更新

[英]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.

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