【问题标题】:Unique index on expressions not recognized for UPSERTUPSERT 无法识别表达式的唯一索引
【发布时间】:2021-10-11 10:35:39
【问题描述】:

我这样做是为了解决关于 PostgreSQL 中的唯一约束在 2 列中包含空值的问题:

CREATE UNIQUE INDEX uc_column1_column2_column3_column4 ON schema.table
(column1, column2, COALESCE(column3, '0'), COALESCE(column4,'0'));

请看这里:Create unique constraint with null columns

但是现在我有另一个问题,因为使用索引而不是约束我有错误:

没有符合 ON CONFLICT 规范的唯一或排除约束

当我执行这个 SQL 请求时:

INSERT INTO table
        (column1,column2, column3, column4, columnA, columnB, columnC) 
        VALUES (1,2,3,4,A,B,C)
ON CONFLICT (column1,column2, column3, column4) 
DO UPDATE SET column1= EXCLUDED.column1
RETURNING *

注意:我确实得到了正确的约束错误,但没有“冲突”行。

【问题讨论】:

  • 关于冲突(column1, column2, COALESCE(column3, '0'), COALESCE(column4,'0'))
  • 请从您的核心表定义CREATE TABLE ... 和您的 Postgres 版本开始。关于DO UPDATE SET column1= EXCLUDED.column1 .. 考虑stackoverflow.com/a/42217872/939860
  • 谢谢 Cetin。它以这种方式按预期工作。谢谢欧文。我将更深入地了解以避免 DO UPDATE SET column1=EXCLUDED.column1 。在我第一次尝试时,DO NOTHING 什么也没返回...

标签: sql postgresql indexing constraints upsert


【解决方案1】:

如果COALESCE(column3, '0')的表达式索引不会导致NULL和0发生冲突,那么不妨先将column3定义为column3 integer NOT NULL DEFAULT 0(猜测数据类型)。 column4 也一样。这将消除所有并发症。

虽然您(必须)使用该表达式索引,但您的“冲突目标”必须与唯一索引的定义相匹配,就像 Cetin 建议的那样:

INSERT INTO table
       (column1, column2, column3, column4, columnA, columnB, columnC) 
VALUES (1, 2, 3, 4, A, B, C)
ON     CONFLICT (column1, column2, COALESCE(column3, '0'), COALESCE(column4,'0')) DO UPDATE
SET    column1 = EXCLUDED.column1
RETURNING *;

由于您使用的是UNIQUE INDEX 而不是UNIQUE CONSTRAINT,因此您不能只提供约束名称,而必须走“唯一索引推断”的路线。或者,正如the manual 所说:

conflict_target 可以执行唯一索引推断。在进行推理时,它由一个或多个 index_column_name 列和/或 index_expression 表达式,以及可选的 @ 987654335@。全部 table_name 唯一索引,不考虑顺序,完全包含 conflict_target 指定的列/表达式 被推断(选择)为仲裁索引。

旁白:

DO UPDATE SET column1= EXCLUDED.column1 从不改变任何定义。它仍然很昂贵,因为它编写了一个新的行版本。可能用于始终返回一行。通常,有更便宜的解决方案。见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多