首页 > 数据库 > mysql教程 > 如何处理 PostgreSQL 的 ON CONFLICT 子句中的多个冲突目标?

如何处理 PostgreSQL 的 ON CONFLICT 子句中的多个冲突目标?

Mary-Kate Olsen
发布: 2025-01-12 17:44:43
原创
450 人浏览过

How to Handle Multiple Conflict Targets in PostgreSQL's ON CONFLICT Clause?

在ON CONFLICT子句中使用多个冲突目标

如果表包含多个唯一列,并且需要INSERT ... ON CONFLICT ... DO UPDATE语法在冲突时更新其他列,则必须创建一个包含所有冲突目标列的唯一索引。

问题:

当尝试在ON CONFLICT子句中使用多个列作为冲突目标时,由于需要唯一索引来执行冲突检测,因此会发生错误。请考虑以下示例:

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>
登录后复制
登录后复制

解决方案:

要解决此问题,请在两列上创建唯一索引:

<code class="language-sql">CREATE UNIQUE INDEX idx_t_col1_col2 ON table (col1, col2);</code>
登录后复制

创建唯一索引后,ON CONFLICT子句可以指定两列作为冲突目标,从而在冲突时实现所需的更新行为:

<code class="language-sql">INSERT INTO table
...
ON CONFLICT (col1, col2)
DO UPDATE
SET
....</code>
登录后复制
登录后复制

示例:

创建一个具有唯一列ida的表,并在处理冲突时插入数据:

<code class="language-sql">CREATE TABLE t (id integer, a text, b text);
CREATE UNIQUE INDEX idx_t_id_a ON t (id, a);
INSERT INTO t VALUES (1, 'a', 'foo');
INSERT INTO t VALUES (1, 'a', 'bar') ON CONFLICT (id, a) DO UPDATE SET b = 'bar';</code>
登录后复制

运行查询以验证已更新的数据:

<code class="language-sql">SELECT * FROM t;</code>
登录后复制

输出:

<code> id | a |  b  
----+---+-----
  1 | a | bar</code>
登录后复制

以上是如何处理 PostgreSQL 的 ON CONFLICT 子句中的多个冲突目标?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板