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

如何在9.5级考试中正确地进行upsert

楚威
2023-03-14

使用postgresql 9.5,查询显示列引用"gallery_id"是不明确的错误,为什么?

var dbQuery = `INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id)
  DO UPDATE SET
  category_id = $1,
  last_modified_date = $3,
  last_modified_by_user_id = $4
  WHERE gallery_id = $2`;

我试着改变WHERE gallery_id=$2 目录_画廊。画廊id=2美元然后显示错误没有唯一或排除约束匹配冲突规范,但我不想将gallery_id或category_id设置为唯一,因为我想确保两列相同,然后进行更新。。。。

如何正确地在postgres 9.5中进行upsert?

如果冲突上的需要唯一列,我应该使用其他方法吗,如何?



我想确定多列都冲突,然后做更新,什么是正确的用法

var dbQuery = `INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id, gallery_id)
  DO UPDATE SET
  category_id = $1,
  last_modified_date = $3,
  last_modified_by_user_id = $4
  WHERE gallery_id = $2`;


var dbQuery = `INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id AND gallery_id)
  DO UPDATE SET
  category_id = $1,
  last_modified_date = $3,
  last_modified_by_user_id = $4
  WHERE gallery_id = $2`;

表(类别id、画廊id非唯一列)

category_id | gallery_id | create_date | create_by_user_id | last_modified_date | last_modified_by_user_id
1 | 1 | ...  
1 | 2 | ...
2 | 2 | ...
1 | 3 | ...

共有2个答案

高朝明
2023-03-14

作为当前可接受答案的简化替代方案,UNIQUE约束可以在创建表时匿名添加:

CREATE TABLE table_name (
    id  TEXT PRIMARY KEY,
    col TEXT,
    UNIQUE (id, col)
);

然后,upsert查询变为(与已回答的内容类似):

INSERT INTO table_name (id, col) VALUES ($1, $2)
ON CONFLICT (id, col)
    DO UPDATE SET col = $2;
陶树
2023-03-14

冲突上的构造需要唯一的约束才能工作。从INSERT。。关于冲突条款:

可选的ON CONFLICT子句指定引发唯一冲突或排除约束冲突错误的替代操作。对于建议插入的每一行,要么继续插入,要么,如果违反了conflict_target指定的仲裁者约束或索引,则采取替代conflict_操作ON CONFLICT NOTHING只是避免插入一行作为其替代操作ON CONFLICT DO UPDATE更新与建议插入的行冲突的现有行,作为其替代操作。

现在,问题还不是很清楚,但您可能需要对组合的两列进行唯一的约束:(category\u id,gallery\u id)

ALTER TABLE category_gallery
    ADD CONSTRAINT category_gallery_uq
    UNIQUE (category_id, gallery_id) ;

如果要插入的行与表中已经存在的行的两个值匹配,则执行UPDATE而不是INSERT

INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id, gallery_id)
  DO UPDATE SET
    last_modified_date = EXCLUDED.create_date,
    last_modified_by_user_id = EXCLUDED.create_by_user_id ;

您可以使用UniQUE约束的列:

  ON CONFLICT (category_id, gallery_id) 

或约束名称:

  ON CONFLICT ON CONSTRAINT category_gallery_uq  

 类似资料:
  • 问题内容: PostgreSQL 9.5的upsert的正确语法,下面的查询显示错误,为什么? 我尝试更改为 然后显示错误,但是 我不想将gallery_id或category_id设置为唯一, 因为我想确保两列都相同然后进行更新.... 如何正确地在postgres 9.5中进行upsert? 如果需要唯一列,我应该使用其他方法,怎么办? 我想确保多列都冲突然后进行更新,正确的用法是什么 表(c

  • 我正在尝试使用测试驱动设计方法编写一个应用程序--我对单元测试很陌生,所以我只是想知道测试正确输入和异常的正确方法是什么。 我有一个用于加载配置文件的类: null 另外,这3个测试是否都有try{}catch(){}语句?在第一个测试中,正确性是隐含的,在第二个和第三个测试中,我无论如何都在检查异常,所以异常对测试没有影响。

  • 问题内容: 我对使用Spring将对象注入到类中有疑问。我在项目中使用了以下代码: 然后通常在以下方法上使用它: 否则,我在Spring示例中发现了注入构造函数的情况: 所以两者都正确吗?还是每个都有其属性和用法? 问题答案: tl; dr-构造函数注入是执行DI的最佳方法 后者是正确的,并不是因为Spring或任何依赖注入容器,而是面向对象的类设计原则。 细节 应该设计一种类型,以便您只能根据其

  • 身处培训教育行业的你,在尝试将考试从线下转移到线上时,一定纠结过:要是能自动阅卷就好了,有答案解析更好,最好还可以限制答题时间……于是,金数据的「在线考试」应运而生。 这个应用能关联你的某个表单,为表单加上分数、阅卷、倒计时等功能,使表单成为一个完整的电子试卷。考试支持的题型有,单选题也可以通过设置是/否的选项变为判断题。 准备考卷 将所有单选、多选和填空题通过单选字段、多选字段和单行文字字段录入

  • 问题内容: 我正在搜索页面,您可以在其中输入搜索查询并将表单提交到。什么PHP函数是最好的,我应该使用它对搜索查询进行编码/解码? 问题答案: 对于URI查询,请使用;对于其他任何事情,请使用/。 和之间的区别是 根据 application/x-www-form-urlencoded编码(空格用编码),而 根据简单的 Percent-Encoding编码 (空格使用编码)。

  • 上下文:我正在使用java1.7.0_07和Jython构建一个JavaFX应用程序。我的应用程序有一个 ScrollPane,其中包含一个 GridPane,其中包含可变数量的 GridPanes。我的应用程序会在每次树视图选择发生更改时丢弃并重新生成最里面的 GridPanes。 问题:当我在树状视图中选择某个内容时,最里面的网格窗格非常大,除了第一个最里面的窗格外,其他所有的网格窗格都被推到