首批通过分布式安全可靠测评,为关键业务系统打造
MERGE
更新时间:2023-07-28 10:45:58
描述
该语句用来根据一张源表更新一张目标表的数据,可以对目标表进行插入、更新或者删除。
语法
MERGE [hint_options] INTO target_table_name [opt_alias]
USING source_table_name [opt_alias]
ON (expr)
[merge_update_clause] [merge_insert_clause]
merge_update_clause:
WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]
merge_insert_clause:
WHEN NOT MATCHED THEN INSERT opt_insert_columns VALUES '(' insert_vals ')' [WHERE expr]
参数解释
| 参数 | 描述 |
|---|---|
| hint_options | 指定 Hint 选项,为可选项。 |
| target_table_name | 指定要更新或插入目标表的表名。 |
| source_table_name | 指定要更新或插入的数据来源的表名。 |
| ON (expr) | 源表和目标表的连接条件。 |
| update_asgn_list | 更新语句的赋值操作。 |
| WHERE expr | 触发更新、删除或者插入操作时的需要满足的条件。 |
示例
示例中的表和数据基于以下定义:
obclient> CREATE TABLE tbl1 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE tbl2 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO tbl1 VALUES(0, 0),(1, null),(2, null);
Query OK, 3 row affected
obclient> INSERT INTO tbl2 VALUES(1, 1),(2, 20),(3, 3),(4, 40);
Query OK, 4 row affected
obclient> SELECT * FROM tbl1;
+------+------+
| COL1 | COL2 |
+------+------+
| 0 | 0 |
| 1 | NULL |
| 2 | NULL |
+------+------+
3 rows in set
obclient> SELECT * FROM tbl2;
+------+------+
| COL1 | COL2 |
+------+------+
| 1 | 1 |
| 2 | 20 |
| 3 | 3 |
| 4 | 40 |
+------+------+
4 rows in set
根据 tbl2 的数据更新 tbl1 的数据:
如果
tbl1.col1在tbl2中能够找到tbl1.col1取值相同的行,如果tbl1.col2取值为空,那么使用tbl2.col2更新tbl1.col2;如果更新之后tbl1.col2 >= 10,那么删除该行。如果
tbl2.col1在tbl1中找不到取值相同的行,将tbl2中的这行插入到tbl1中,且只插入满足tbl2.col2 < 10的行。
obclient>MERGE INTO tbl1 USING tbl2 ON (tbl1.col1 = tbl2.col1)
WHEN MATCHED THEN UPDATE SET tbl1.col2 = tbl2.col2 WHERE tbl1.col2 IS NULL DELETE
WHERE tbl1.col2 >= 10
WHEN NOT MATCHED THEN INSERT VALUES(tbl2.col1, tbl2.col2)
WHERE tbl2.col2 < 10;
Query OK, 3 rows affected
obclient> SELECT * FROM tbl1;
+------+------+
| COL1 | COL2 |
+------+------+
| 0 | 0 |
| 1 | 1 |
| 3 | 3 |
+------+------+
3 rows in set