我想使用插入..上的confict做更新..語法與表中有兩列的唯一約束。這可能嗎?Postgres衝突處理與多個唯一的約束
例如mytable在col1和col2上分開了獨特的約束。
我可以這樣寫:
INSERT INTO mytable(col1, col2, col3) values ('A', 'B', 0) ON CONFLICT DO NOTHING;
但是這不起作用:
INSERT INTO mytable(col1, col2, col3) VALUES ('A', 'B', 0)
ON CONFLICT
DO UPDATE SET col3 = EXCLUDED.col3 + 1;
錯誤:衝突DO更新需要推理規範或約束名
這也不會工作:
INSERT INTO mytable(col1, col2, col3) VALUES ('A', 'B', 0)
ON CONFLICT (col1, col2)
DO UPDATE SET col3 = EXCLUDED.col3 + 1;
錯誤:沒有與ON CONFLICT規範相匹配的唯一約束或排除約束
此語法似乎是針對兩列上的單個複合唯一約束而非兩個約束設計的。
如果違反唯一約束條件,是否有任何方法可以進行條件更新?這個問題How to upsert in Postgres on conflict on one of 2 columns?暗指,但不提供語法。
恕我直言,這個問題沒有任何意義。在'衝突簡單案例'中:密鑰被保留,並且(一些)相關字段被更新。就你而言,你打算更新另一個(候選)密鑰。事實上,你試圖更新兩個(候選)鍵,這超出了我的邏輯。 – wildplasser
我已經更新了示例以使其更加真實。這個想法是保持一個與任一唯一列匹配的計數器列是最新的,或者如果兩者都不存在,則插入零。 –
添加一個額外的約束'UNIQUE(col1,col2)'可能會做你想做的。 (它在邏輯上是多餘的,但數據模型無論如何沒有多少意義或沒有意義) – wildplasser