【问题标题】:POSTGRES - Handling several ON CONFLICT constraints/indexesPOSTGRES - 处理几个 ON CONFLICT 约束/索引
【发布时间】:2017-06-24 04:16:30
【问题描述】:

表中有以下内容:

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

谢谢。

【问题讨论】:

标签: sql database postgresql


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

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多