Postgresql

多個衝突目標

  • August 7, 2019

我在列上有兩個唯一索引,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- 沒有衝突目標 - 適用於任何適用的違規行為。這個變體的替代動作(“什麼都不做”)是明確的。

您必須更加具體(也關於並發和可能的寫入負載)才能獲得更具體的答案。

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