From 06cb4ce1eab1bbbecd2ad93c59b4d2636de71b19 Mon Sep 17 00:00:00 2001 From: gentle_hu Date: Sat, 29 Aug 2020 11:04:53 +0800 Subject: [PATCH] upsert docs --- content/zh/docs/Developerguide/INSERT.md | 42 ++++++++++++++----- ...71\346\263\225\351\205\215\347\275\256.md" | 18 ++++++++ .../\345\205\263\351\224\256\345\255\227.md" | 9 ++++ 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/content/zh/docs/Developerguide/INSERT.md b/content/zh/docs/Developerguide/INSERT.md index 5b08dbbb9..46c97ac06 100644 --- a/content/zh/docs/Developerguide/INSERT.md +++ b/content/zh/docs/Developerguide/INSERT.md @@ -24,7 +24,7 @@ INSERT INTO table_name [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query } - [ ON DUPLICATE KEY UPDATE { column_name = { expression | DEFAULT } } [, ...] ] + [ ON DUPLICATE KEY UPDATE {{ column_name = { expression | DEFAULT } } [, ...] | NOTHING} ] [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; ``` @@ -104,18 +104,31 @@ INSERT INTO table_name [ ( column_name [, ...] ) ] - **ON DUPLICATE KEY UPDATE** - 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。 - - 对于不带唯一约束的表,则仅执行插入。 - - - 不支持触发器,不会触发目标表的INSERT或UPDATE触发器。 + 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新。对于不带唯一约束的表,则仅执行插入。UPDATE时,若指定NOTHING则忽略此条插入,可通过"EXCLUDE." 或者 "VALUES()" 来选择源数据相应的列。 + - 支持触发器,触发器执行顺序由实际执行流程决定: + - 执行insert:触发before insert、after insert触发器 + - 执行update:触发before insert、before update、after update触发器 + - 执行update nothing:触发before insert触发器。 - 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 - - - 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 - - - 分布列、唯一索引列不允许UPDATE。 - - 不支持列存。 +- 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 + + - 如果插入多行,这些行均与表中同一行数据存在唯一约束冲突,则按照顺序,第一条执行插入或更新,之后依次执行更新。 +- 主键、唯一索引列不允许UPDATE。 + - 不支持列存,不支持外表、内存表。 + + >![](public_sys-resources/icon-note.gif) **说明:** + >当GUC参数 [enable_upsert_to_merge](优化器方法配置.md#zh-cn_topic_0237124716_section1211182712177) 为 on 时,此条INSERT ON DUPLICATE KEY UPDATE语句(UPSERT语句)会被转换成一条具有同等语义的MERGE INTO语句,之后的行为与MERGE INTO相同,在如下行为中与UPSERT将会不同: + > + >- 不支持UPDATE更新自定义类型或者数组类型的元素的值 + >- 如果INSERT指定了目标列,那么仅检查只包含目标列或设有DEFAULT值的列的唯一约束或主键约束冲突。 + >- 当表中存在多个唯一约束,如果所插入数据与表中多个行都存在唯一约束冲突,所有冲突行都会执行UPDATE子句完成更新。 + >- 如果插入多行,这些行均与表中同一行数据存在唯一约束冲突,执行会失败。需设置GUC参数[behavior_compat_options](其它选项.md#zh-cn_topic_0237124754_section1980124735516)='merge_update_multi',允许该对冲突行会执行多次UPDATE。 + >- 如果插入多行,这些行与表中已有数据不存在唯一约束冲突,但是相互违反唯一约束时,INSERT执行失败。 + >- 在多行插入场景,执行性能较差。由于MERGE INTO不支持并发更新,在多行插入情况下,容易出现报错导致事务回滚。 + >- 通过EXPLAIN 显示的计划为转换为MERGE INTO语句的执行计划。 + > + > ## 示例 @@ -147,6 +160,13 @@ postgres=# CREATE UNIQUE INDEX reason_t2_u_index ON tpcds.reason_t2(r_reason_sk) --向表中插入多条记录,如果冲突则更新冲突数据行中r_reason_id字段为'BBBBBBBBCAAAAAAA'。 postgres=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = 'BBBBBBBBCAAAAAAA'; +--向表中插入多条记录,如果冲突则忽略此条插入。 +postgres=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE NOTHING; + +--向表中插入多条记录,如果冲突则更新冲突数据行中r_reason_id字段为插入数据的r_reason_id值。 +postgres=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = EXCLUDED.r_reason_id; +postgres=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = values(r_reason_id); + --删除表tpcds.reason_t2。 postgres=# DROP TABLE tpcds.reason_t2; ``` diff --git "a/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" index 8a1cfe90a..03b48bb08 100644 --- "a/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" +++ "b/content/zh/docs/Developerguide/\344\274\230\345\214\226\345\231\250\346\226\271\346\263\225\351\205\215\347\275\256.md" @@ -333,3 +333,21 @@ **默认值**:normal +## enable_upsert_to_merge + +**参数说明**:控制是否将INSERT ON DUPLICATE KEY UPDATE转换为等价的MERGE INTO语句。 + +该参数属于USERSET类型参数,请参考[表1](重设参数.md#zh-cn_topic_0237121562_zh-cn_topic_0059777490_t91a6f212010f4503b24d7943aed6d846)中对应设置方法进行设置。 + +**取值范围**:布尔型 + +- off:不进行转换。 +- on:进行转换。 + +**默认值**:off + +>![](D:/worktmp/opengauss-docs-master/docs/content/zh/docs/Developerguide/public_sys-resources/icon-notice.gif) **须知:** +>enable_upsert_to_merge开启后,INSERT ON DUPLICATE KEY UPDATE与原执行方式下的差异请参考 [INSERT](INSERT.md) 中 ON DUPLICATE KEY UPDATE 说明。 +> +> + diff --git "a/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" "b/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" index 4c4a9373a..103fa1cae 100644 --- "a/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" +++ "b/content/zh/docs/Developerguide/\345\205\263\351\224\256\345\255\227.md" @@ -1919,6 +1919,15 @@ SQL里有保留字和非保留字之分。根据标准,保留字决不能用

-

+

EXCLUDED

+ +

保留

+ +

-

+ +

-

+ +

EXCLUDING

非保留

-- Gitee