---
title: github-fill
description: 替换数据 可以使用 MERGE INTO 语句对目标表进行插入或更新记录。 替换数据准备 在插入数据前，请确认以下事项： 请确认您已连接到数据库的 Oracle 租户，连接数据库的操作请参见 连接方式概述 。 说明 当前登录租户所属的租户模式可以由 sys 租户通过查询 oceanbase.DBA_OB_TENANT…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 替换数据

更新时间：2026-03-07 10:26:21

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/300.develop/200.application-development-of-oracle-mode/400.write-data-of-oracle-mode/400.replace-data-of-oracle-mode-in-develop.md)  

可以使用 `MERGE INTO` 语句对目标表进行插入或更新记录。

## 替换数据准备

在插入数据前，请确认以下事项：

- 请确认您已连接到数据库的 Oracle 租户，连接数据库的操作请参见 [连接方式概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476144)。

  #### 说明

  当前登录租户所属的租户模式可以由 `sys` 租户通过查询 `oceanbase.DBA_OB_TENANTS` 视图进行确认。
 - 请确认您已拥有源表的 `SELECT` 对象权限，以及目标表的 `INSERT` 和 `UPDATE` 权限，查看当前用户权限的相关操作请参见 [查看用户权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479232)。如果不具备该权限，请联系管理员为您授权，用户授权的相关操作请参见 [直接授予权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479231)。

## 替换表数据

请使用 [MERGE INTO](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480984) 语句替换目标表中的一条或多条记录。

`MERGE INTO` 语句的语法格式如下：

```sql
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` 的信息如下：

```shell
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` 中。

```shell
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` 语句更新目标表的记录。

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]> 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` 中的数据的示例如下：

```shell
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 修改远端数据库中的数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476653)。

## 相关文档

- [插入数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476122)
 - [更新数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476124)
 - [删除数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476126)
 - [通过 DBLink 修改远端数据库中的数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476653)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
