在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>
示例:
创建一个具有唯一列id
和a
的表,并在处理冲突时插入数据:
<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中文网其他相关文章!