当前位置: 首页 > 知识库问答 >
问题:

无法识别UPSERT表达式的唯一索引

邵宜年
2023-03-14

我这样做是为了解决PostgreSQL中唯一约束的两列中有空值的问题:

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

请参见此处:使用空列创建唯一约束

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

不存在与冲突规范匹配的唯一或排除约束

当我这样做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 *

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

共有1个答案

荣德厚
2023-03-14

如果带有合并(column3,'0')的表达式索引不会导致NULL0之间的冲突,那么您最好首先将column3定义为column3 integer not NULL默认值0(猜测数据类型)。与第4列相同。这将消除所有的并发症。

当你(必须)使用该表达式索引时,你的“冲突目标”必须与唯一索引的定义相匹配,就像塞廷建议的那样:

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 *;

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

conflict_target可以执行唯一索引推断。当执行推断时,它由一个或多个index_column_name列和/或index_expression表达式以及一个可选的index_predicate组成。所有的table_name唯一索引,如果不考虑顺序,恰好包含指定的conflict_target列/表达式,则推断(选择)为仲裁索引。

旁边:

DO UPDATE SET column1=已排除。column1从不根据定义更改任何内容。在编写新的行版本时,它的成本仍然很高。可能用于始终返回一行。通常,有更便宜的解决方案。见:

  • 如何在PostgreSQL中使用返回与ON CONFLICT
 类似资料:
  • 我做错了什么?我应该使用吗? 用于允许推断部分唯一索引的index_predicate。可以推断出满足谓词的任何索引(实际上不必是部分索引)。遵循创建索引格式。https://www.PostgreSQL.org/docs/9.5/static/sql-insert.html

  • 我有以下正则表达式: 如您所见,我正在尝试设置两个命名的捕获组—和。但是,在运行此命令并检查匹配组时,没有group-只有。 使用C#: 我能够通过在https://regex101.com/. 如果您放入以下测试字符串: 您会注意到您只返回了一个命名的捕获组-。 为什么没有被返回? 看起来我对命名的捕获组使用了正确的语法。我尝试在捕获组外和正则表达式模式内添加括号,但都没有成功。我在想也许Reg

  • 问题内容: 我有两个表,和。有一个字段,它通过外键指向具有相同名称的字段。它还具有在该字段上声明的唯一密钥。不可为空。这意味着关系必须为0..1到1,因为每个 记录都必须具有唯一的而不是空的记录。 实体框架不这样看。我收到以下错误: 这是什么问题 如何使EF识别适当的关系多重性? 问题答案: EF抱怨是因为听起来您正在使用FK关联-这意味着VisualizationID是Entity的属性,并且也

  • 本文向大家介绍JSP页面无法识别EL表达式问题解决方案,包括了JSP页面无法识别EL表达式问题解决方案的使用技巧和注意事项,需要的朋友参考一下 今天在JSP页面接收Controller返回的数据user_nickname,使用EL表达式显示数据发现在页面输出的始终是字符串${user_nickname} 经过查阅资料,问题在于使用的web.xm版本约束为2.3时,JSP头部未设置isELIgnor

  • 问题内容: 当我尝试将行插入到SQL Azure表中时,出现以下错误。 此版本的SQL Server不支持没有聚集索引的表。请创建一个聚集索引,然后重试。 我的问题是我在该表上确实有一个聚集索引。我使用SQL Azure MW生成Azure SQL脚本。 这是我正在使用的: 为什么SQL Azure无法识别我的群集密钥?我的脚本错了吗? 问题答案: 您的脚本只会创建该表(如果该表尚不存在)。也许还

  • 在我的一个方面,我有以下方法: 目标是找到我的应用程序包的所有方法,其中至少有一个参数用@standarized注释(而不是用不同的@standarized注释的类型) ps:@标准化是一个自定义注释。 从我在留档中读到的内容来看,这个配置应该是正确的(如果不是,请告诉我),但是当我在JBoss服务器下部署我的应用程序时,我有以下异常: java.lang.IllegalArgumentExcep