Postgresql
多個衝突目標
我在列上有兩個唯一索引,
a
並且b
. 我需要這樣的東西:insert into my_table (a, b) values (1, 2), (1, 2) on conflict (a) do update set c = 'a_violation' on conflict (b) do update set c = 'b_violation'
所以通常我想根據衝突目標進行不同的更新——不支持上面的語法(只支持一個
on conflict
語句)。有沒有其他方法可以做到這一點?
您的範例建議子句本身中有重複的行
VALUES
- 這將導致:錯誤:ON CONFLICT DO UPDATE 命令不能再次影響行
可以通過折疊輸入中的重複項來解決。看:
但是一個相關的問題會影響您概述的整個查詢,而這並不容易克服。
如果同一輸入行觸發多個唯一違規怎麼辦?
如果多個輸入行觸發相同的唯一違規怎麼辦?
如果多個輸入行觸發同一目標行的不同唯一違規怎麼辦?
及其組合。
Postgres 開發人員可能不想打開這個蠕蟲罐,並將 UPSERT 功能限制為單個約束。
ON CONFLICT DO NOTHING
- 沒有衝突目標 - 適用於任何適用的違規行為。這個變體的替代動作(“什麼都不做”)是明確的。您必須更加具體(也關於並發和可能的寫入負載)才能獲得更具體的答案。