本記事では、主にSQL文を使用してテーブル間のデータ移行を実現する方法について説明します。
テーブル間のデータ移行
構文 1
INSERT INTO target_table_name[(target_col_name[, target_col_name] ...)]
SELECT [(source_col_name[, source_col_name] ...)]
FROM source_table_name
[WHERE expr];
パラメータの説明:
| パラメータ | 説明 |
|---|---|
| target_table_name | データ移行のターゲットテーブル。 |
| target_col_name | ターゲットテーブルの列名。ターゲットテーブルのすべての列データを更新する場合は、列名を指定しなくても構いません。 |
| source_col_name | ソーステーブルの列名。移行する列を選択します。すべてのデータを選択する場合は、* を使用して表すことができます。
注意選択した列数は、ターゲットテーブルの列数と一致させる必要があります。 |
| source_table_name | データ移行のソーステーブル。 |
| WHERE expr | データ移行のフィルター条件。この項目を指定しない場合、SELECT で選択されたすべての行が移行されます。 |
構文 2
適用対象
MERGE ステートメントは、現在のところOceanBaseデータベースのOracleモードのみをサポートしています。
MERGE INTO target_table_name
USING source_table_name
ON (expr)
WHEN NOT MATCHED THEN INSERT VALUES((source_col_name[, source_col_name] ...))
[WHERE expr];
パラメータの説明:
| パラメータ | 説明 |
|---|---|
| target_table_name | データ移行のターゲットテーブル。 |
| source_table_name | データ移行のソーステーブル。 |
| ON (expr) | ソーステーブルとターゲットテーブルの結合条件。 |
| source_col_name | ソーステーブルの列名。移行する列を選択します。すべてのデータを選択する場合は、* を使用します。
注意選択した列数はターゲットテーブルの列数と一致している必要があり、移行するデータはターゲットテーブルのデータ型に適合していなければなりません。 |
| WHERE expr | 移行データのフィルタリング条件。 |
例1
テーブル tbl1 内の条件(age > 10)に一致するデータを、テーブル tbl2 に挿入します。
obclient [test]> SELECT * FROM tbl1;
+------+------+------+
| id | name | age |
+------+------+------+
| 1 | ab | 8 |
| 2 | bc | 18 |
| 3 | cd | 14 |
| 4 | de | 19 |
| 5 | ef | 6 |
| 6 | fg | 15 |
+------+------+------+
6 rows in set
obclient [test]> DESC tbl2;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col1 | int(11) | YES | | NULL | |
| col2 | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set
obclient [test]> SELECT * FROM tbl2;
Empty set
obclient [test]> INSERT INTO tbl2 SELECT id,age FROM tbl1 WHERE age > 10;
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
obclient [test]> SELECT * FROM tbl2;
+------+------+
| col1 | col2 |
+------+------+
| 2 | 18 |
| 3 | 14 |
| 4 | 19 |
| 6 | 15 |
+------+------+
4 rows in set
例2
テーブル tbl1 内で、テーブル tbl2 の値と同じ行(tbl1.id=tbl2.col1 and tbl1.age=tbl2.col2)が見つからない場合、tbl1 内のその行を tbl2 に挿入します。ただし、挿入されるのは tbl1.age < 10 を満たす行のみです。
obclient [SYS]> SELECT * FROM tbl1;
+------+------+------+
| ID | NAME | AGE |
+------+------+------+
| 1 | ab | 8 |
| 2 | bc | 18 |
| 3 | cd | 14 |
| 4 | de | 19 |
| 5 | ef | 6 |
| 6 | fg | 15 |
+------+------+------+
6 rows in set
obclient [SYS]> SELECT * FROM tbl2;
Empty set
obclient [SYS]> MERGE INTO tbl2
USING tbl1
ON (tbl1.id=tbl2.col1 and tbl1.age=tbl2.col2)
WHEN NOT MATCHED THEN INSERT VALUES(tbl1.id,tbl1.age)
WHERE tbl1.age < 10;
Query OK, 2 rows affected
obclient [SYS]> SELECT * FROM tbl2;
+------+------+
| COL1 | COL2 |
+------+------+
| 1 | 8 |
| 5 | 6 |
+------+------+
2 rows in set