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

SQL Upsert语句不适用于非索引列

宋唯
2023-03-14

我使用的是PostgreSQL v9。6.6. 我正在运行以下SQL:

insert into t_vs_config_key (name, description, is_brand_dependent)
  values ('ucp.cluster','UCP Cluster', true)
  ON CONFLICT (name) DO UPDATE SET is_brand_dependent=true;

这将导致以下错误,因为name列的索引不是唯一的。我不能添加索引,因为有一些存量数据不是唯一的。

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

问:有没有办法在没有索引的情况下执行upsert语句?

谢谢

共有1个答案

陶瀚玥
2023-03-14

正如评论中已经提到的,如果没有唯一的索引,就不能对冲突使用

但是,您可以通过向表中添加一个指示行是否有效的新列,并根据该标志创建一个部分唯一索引来确保未来的插入是唯一的:

alter t_vs_config_key 
  add column valid boolean not null default false;

这将初始化所有现有的行有效=false

现在,对于未来的行,将此列的默认值更改为true

alter table t_vs_config_key
    alter column valid set default true;

并通过添加检查约束来确保不再插入“无效”行:

alter table t_vs_config_key  
  add constraint check_valid check (valid);

现在,您可以创建一个唯一的索引:

create unique index on t_vs_config_key(name)
where valid;

它可以用于冲突子句的

insert into t_vs_config_key (name, description, is_brand_dependent)
values ('ucp.cluster','UCP Cluster', true)
ON CONFLICT (name) where valid DO UPDATE 
  SET is_brand_dependent = true;

注意语句中的在哪里有效子句。

 类似资料:
  • 我想要什么 在JPanel上,我有一个JButton和一个JTextArea。按下JButton后,必须在JTextArea中打印某些文本。此特定文本由if-else语句确定。if-else的条件基于整数变量R。 基本上,这是我试图进行的类似问答的调查。我使用R来记录用户的答案。当用户单击一个选项时,R的值会更新。 我使用字符串变量你的手机。如果R的值为最后例如120,则您的手机将更新为字符串,例

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 问题内容: 我打开控制台(chrome \ firefox)并运行以下行: 内容未包含在#popupFrame中,这使它变得很奇怪。 目标是创建像firefox这样的警告框 问题答案: 第二个div是(默认值),因此z-index不适用于它。 您需要定位(将位置属性设置为,而不是在这种情况下可能需要的其他位置)要分配给的任何内容。

  • 问题内容: 我有一个默认位置(即)和一个位置。 如果设置元素的z索引,似乎不可能使固定元素位于静态元素之后。 我可以通过 在static元素上使用来解决此问题 ,但是有人可以告诉我 为什么会 这样吗? (似乎有一个与此问题类似的问题,固定位置破坏了z-index,但是它没有令人满意的答案,因此我在这里用示例代码来询问) 问题答案: 这个问题可以通过多种方式解决,但实际上,了解堆叠规则可以使您找到最

  • Java代码:包com.example.triangleGame; xml代码