首批通过分布式安全可靠测评,为关键业务系统打造
替换数据
更新时间:2026-03-07 10:26:21
可以使用 MERGE INTO 语句对目标表进行插入或更新记录。
替换数据准备
在插入数据前,请确认以下事项:
请确认您已连接到数据库的 Oracle 租户,连接数据库的操作请参见 连接方式概述。
说明
当前登录租户所属的租户模式可以由
sys租户通过查询oceanbase.DBA_OB_TENANTS视图进行确认。请确认您已拥有源表的
SELECT对象权限,以及目标表的INSERT和UPDATE权限,查看当前用户权限的相关操作请参见 查看用户权限。如果不具备该权限,请联系管理员为您授权,用户授权的相关操作请参见 直接授予权限。
替换表数据
请使用 MERGE INTO 语句替换目标表中的一条或多条记录。
MERGE INTO 语句的语法格式如下:
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col1_val,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
| 参数 | 是否必填 | 描述 |
|---|---|---|
| MERGE INTO table_name alias1 | 是 | 指定需要插入数据的表和别名。 |
| USING (table|view|sub_query) alias2 | 是 | 指定源表(视图、子查询)和别名。 |
| ON (join condition) | 否 | 指定判断条件。 |
| WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1 , col2 = col2_val | 是 | 当条件匹配时,执行 UPDATE 语句。 |
| WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values); | 是 | 当条件不匹配时,执行 INSERT 语句。 |
使用 MERGE INTO 语句替换数据时,如果源表中的记录在目标表中不存在,则向目标表中插入数据;如果源表中的记录在目标表中存在,则更新记录。
源表中的记录在目标表中不存在
当源表中的记录在目标表中不存在时,可以使用 MERGE INTO 语句将源表中的记录插入到目标表中。
已知源表 t_merge 的信息如下:
obclient [SYS]> CREATE TABLE t_merge(
id number NOT NULL PRIMARY KEY,
name varchar2(50) NOT NULL,
value number,
gmt_create date NOT NULL DEFAULT sysdate,
gmt_modified date NOT NULL DEFAULT sysdate
);
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO t_merge(id,name,value) VALUES(4,'JP',10004),(5,'CN',10005);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
obclient [SYS]> SELECT * FROM t_merge;
+----+------+-------+------------+--------------+
| ID | NAME | VALUE | GMT_CREATE | GMT_MODIFIED |
+----+------+-------+------------+--------------+
| 4 | JP | 10004 | 31-OCT-22 | 31-OCT-22 |
| 5 | CN | 10005 | 31-OCT-22 | 31-OCT-22 |
+----+------+-------+------------+--------------+
2 rows in set
示例 1:使用 MERGE INTO 语句将表 t_merge 中的数据插入到表 t_insert 中。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 31-OCT-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> MERGE INTO t_insert a
USING (SELECT id,name,value,gmt_create FROM t_merge) b
ON (a.id = b.id)
WHEN MATCHED THEN
UPDATE SET a.name = b.name, a.value = b.value, a.gmt_create = sysdate
WHEN NOT MATCHED THEN
INSERT (a.id,a.name,a.value) VALUES(b.id, b.name, b.value);
Query OK, 3 rows affected
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 31-OCT-22 |
| 4 | JP | 10004 | 31-OCT-22 |
| 5 | CN | 10005 | 31-OCT-22 |
+----+------+-------+------------+
5 rows in set
示例 1 中,目标表 t_insert 的 id 列为主键列,需要满足唯一性约束,同时,源表中的记录 (4,'JP',10004),(5,'CN',10005) 在目标表中不存在,则直接将源表中的记录插入到目标表中。
源表中的记录在目标表中存在
当源表中的记录在目标表中存在时,可以使用 MERGE INTO 语句更新目标表的记录。
已知源表 t_merge 的信息如下:
obclient [SYS]> CREATE TABLE t_merge(
id number NOT NULL PRIMARY KEY,
name varchar2(50) NOT NULL,
value number,
gmt_create date NOT NULL DEFAULT sysdate,
gmt_modified date NOT NULL DEFAULT sysdate
);
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO t_merge(id,name,value) VALUES(3,'CN',10003),(4,'JP',10004),(5,'CN',10005);
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
obclient [SYS]> SELECT * FROM t_merge;
+----+------+-------+------------+--------------+
| ID | NAME | VALUE | GMT_CREATE | GMT_MODIFIED |
+----+------+-------+------------+--------------+
| 3 | CN | 10003 | 01-NOV-22 | 01-NOV-22 |
| 4 | JP | 10004 | 01-NOV-22 | 01-NOV-22 |
| 5 | CN | 10005 | 01-NOV-22 | 01-NOV-22 |
+----+------+-------+------------+--------------+
3 rows in set
示例 2:使用 MERGE INTO 语句更新 t_insert 表中 name 和 value 列的数据。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 31-OCT-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> MERGE INTO t_insert a
USING (SELECT id,name,value,gmt_create FROM t_merge ) b
ON (a.id = b.id)
WHEN MATCHED THEN
UPDATE SET a.name = b.name, a.value = b.value, a.gmt_create = sysdate
WHEN NOT MATCHED THEN
INSERT (a.id,a.name,a.value) VALUES(b.id, b.name, b.value);
Query OK, 3 rows affected
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | CN | 10003 | 01-NOV-22 |
| 4 | JP | 10004 | 01-NOV-22 |
| 5 | CN | 10005 | 01-NOV-22 |
+----+------+-------+------------+
5 rows in set
示例 2 中,目标表 t_insert 的 id 列为主键列,需要满足唯一性约束,源表 t_merge 中的记录 (3,'CN',10003) 与目标表 t_insert 存在相同的记录,将目标表中的记录更新。
通过 DBLink 使用 MERGE INTO 语句替换数据
当前 OceanBase 数据库支持通过 DBLink 向 OceanBase 数据库(Oracle 模式)和 Oracle 数据库中写入数据。
通过 DBLink 替换远端数据库表 t3 中的数据的示例如下:
obclient> SELECT * FROM t3@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 3 |
| 4 | 4 |
+------+------+
2 row in set
obclient> SELECT * FROM t4;
+------+------+
| C1 | C2 |
+------+------+
| 5 | 5 |
| 6 | 6 |
+------+------+
2 row in set
obclient> MERGE INTO t3@orcl_dblink a
USING (SELECT C1,C2 FROM t4 ) b
ON (a.C1 = b.C1)
WHEN MATCHED THEN
UPDATE SET a.C2 = b.C2
WHEN NOT MATCHED THEN
INSERT (a.C1,a.C2) VALUES(b.C1, b.C2);
Query OK, 2 rows affected
obclient> commit;
Query OK, 0 rows affected
obclient> SELECT * FROM t3@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+------+
4 row in set
OceanBase 数据库 Oracle 模式支持把本地表数据写入(INSERT、DELETE、UPDATE 和 MERGE INTO)远端表,详细信息,参见 通过 DBLink 修改远端数据库中的数据。