本記事では、主に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