MERGE INTO ステートメントを使用すると、ターゲットテーブルにレコードを挿入または更新できます。
データ置換の準備
データの挿入の前に、以下の項目を確認してください:
データベースのOracleテナントに接続されていることを確認してください。データベースへの接続操作については、接続方法の概要を参照してください。
説明
現在ログインしているテナントが属するテナントモードは、
sysテナントでoceanbase.DBA_OB_TENANTSビューをクエリすることで確認できます。ソーステーブルの
SELECTオブジェクト権限、およびターゲットテーブルのINSERTとUPDATE権限をお持ちであることを確認してください。現在のユーザー権限の確認に関する操作については、ユーザー権限の確認を参照してください。該当する権限を持っていない場合は、管理者に連絡し権限の付与を依頼してください。ユーザー権限に関する操作については、直接権限付与を参照してください。
テーブルデータの置換
ターゲットテーブル内の1つまたは複数のレコードを置き換えるには、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を使用してリモートデータベースのデータを変更するを参照してください。