在表格中有以下内容:
CONSTRAINT unique_position UNIQUE (id,city,type)
和
CREATE UNIQUE INDEX unique_position_sat_null ON public."position" (id,city) where type is null
插入冲突目前有:
ON CONFLICT ON CONSTRAINT unique_position DO UPDATE SET
.....
如何将unique_position和unique_position_sat_null合并到 ON CONFLICT ON CONSTRAINT
尝试:
ON CONFLICT ON CONSTRAINT unique_position DO UPDATE SET
.....,
ON CONFLICT ON CONSTRAINT unique_position_sat_null DO UPDATE SET
.....,
和
ON CONFLICT ON CONSTRAINT unique_position and unique_position_sat_null DO UPDATE SET
.....,
谢谢。
答案 0 :(得分:1)
不幸的是,独特的索引和独特的约束在Postgres中并不是一回事。
当您定义唯一索引而不是约束时,Postgres不会创建具有相同名称的约束(如果在INSERT期间发生冲突,它将产生错误“唯一约束违规”,提及索引的名称,但这是次要的错误,请参阅https://www.postgresql.org/message-id/flat/CAH2-Wzn-uXcLgC5uFbqe2rUfmJWP9AxKnMKAEgqU26hbURxk5A%40mail.gmail.com#CAH2-Wzn-uXcLgC5uFbqe2rUfmJWP9AxKnMKAEgqU26hbURxk5A@mail.gmail.com)
所以你不能使用索引名称,因为它是一个约束名。
你可以做ALTER TABLE .. ADD CONSTRAINT .. UNIQUE,但它不能是唯一的。
所以这可以被认为是Postgres中尚未实现的功能 - “ON CONFLICT”子句需要学习如何使用索引名称或ALTER TABLE .. ADD CONSTRAINT .. UNIQUE需要修补以允许部分约束
我建议在pgsql-hackers @邮件列表中讨论它(例如,如果你回答上面提到的线程,解释你的问题,它会很棒)。