POSTGRES - 处理几个ON CONFLICT约束/索引

时间:2017-06-23 18:39:04

标签: sql database postgresql

在表格中有以下内容:

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
            .....,

谢谢。

1 个答案:

答案 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 @邮件列表中讨论它(例如,如果你回答上面提到的线程,解释你的问题,它会很棒)。