概要
このステートメントは、テーブルに1つまたは複数のレコードを追加するために使用されます。
権限要件
INSERT ステートメントを実行するには、現在のユーザーが INSERT のシステム権限を持っている必要があります。OceanBaseデータベースの権限の詳細については、Oracleモードの権限分類を参照してください。
構文
INSERT [hint_options] { single_table_insert | multi_table_insert | overwrite_table_insert};
single_table_insert:
{ INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } '(' column_list ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
| INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } '(' ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
| INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
}
hint_options:
[/*+ [APPEND | DIRECT(bool, int, load_mode)] enable_parallel_dml PARALLEL(N) | NO_DIRECT */]
[INTO] table_name [PARTITION(PARTITION_OPTION)]
column_list:
column_definition_ref [, column_definition_ref...]
returning_exprs:
projection_col_name [,projection_col_name ...]
insert_into_clause:
{ INTO into_var_list | BULK COLLECT INTO into_var_list}
into_var_list:
{ USER_VARIABLE | ref_name } [, { USER_VARIABLE | ref_name }...]
values_clause:
VALUES ({ expr | DEFAULT } [, { expr | DEFAULT } ]... )
returning_exprs:
projection_col_name [,projection_col_name ...]
multi_table_insert:
{ ALL { insert_into_clause [ values_clause ] [error_logging_clause] }
| conditional_insert_clause
} subquery
conditional_insert_clause:
[ ALL | FIRST ]
WHEN condition
THEN insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
[ WHEN condition
THEN insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
]...
[ ELSE insert_into_clause
[ values_clause ]
[ error_logging_clause ]
[ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
]
error_logging_clause:
LOG ERRORS [ INTO [schema.] table_name] [ (simple_expression) ] [ REJECT LIMIT { integer | UNLIMITED } ]
overwrite_table_insert:
[/*+PARALLEL(N)*/] OVERWRITE table_name [(list_of_columns)] [PARTITION (partition_name, ...)] select_stmt
パラメータの説明
| パラメータ | 説明 |
|---|---|
| hint_options | Hintを使用してダイレクトロード機能を有効にするオプションです。詳細については、Hintの概要を参照してください。
注意ダイレクトロードタスクを実行している間、OceanBaseデータベースのアップグレード作業は同時に行わないことを推奨します。これにより、ダイレクトロードタスクが失敗する可能性があるためです。 INSERT INTO SELECTステートメントでは、APPEND \| DIRECT()\| NO_DIRECT Hintを使用してデータのインポート方法を制御できます。書式は /*+ [APPEND \| DIRECT(bool, int, load_mode)] enable_parallel_dml PARALLEL(N) \| NO_DIRECT */ です。Hintの各パラメータの説明は以下のとおりです:
INSERT INTO SELECTを使用したダイレクトロードの詳細については、INSERT INTO SELECTステートメントを使用したダイレクトロードを参照してください。 |
| table_name | インポート元のデータのテーブル名。テーブルの列数を任意に指定できます。 |
| PARTITION_OPTION | パーティションのダイレクトロード時のパーティション名を指定します:
|
| single_table_insert | 単一テーブルへの挿入。 |
| insert_table_clause | 挿入するテーブルを指定します。ベーステーブル、更新可能なビュー、または特別なサブクエリを指定できます。
注意特別なサブクエリとは、更新可能なビューに対応するサブクエリに似たものであり、このようなサブクエリには複雑な演算子(例えば |
| opt_nologging | 挿入時のログ情報をできるだけ削減します。 |
| column_list | 挿入する列名を指定します。 |
| returning_exprs | 挿入データ後の投影列を返します。 |
| insert_into_clause | 挿入データ後の列値を指定したリストに挿入します。 |
| multi_table_insert | 複数テーブルへの挿入。 |
| conditional_insert_clause | 条件付きの複数テーブル挿入。
|
| error_logging_clause | SQLエラーと影響を受けた行数列の値をエラーレコードテーブルに保存します。 |
| overwrite_table_insert | クエリ結果でテーブルまたはパーティション内の既存データを置き換えるために使用されます。INSERT OVERWRITE SELECT ステートメントの使用方法の詳細については、データの挿入のINSERT OVERWRITE SELECTステートメントを使用したデータの挿入セクションを参照してください。 |
| list_of_columns | テーブル内にデータを挿入する列を指定します。 |
| select_stmt | SELECT 句を指定します。クエリステートメントの詳細については、SIMPLE SELECTを参照してください。 |
例
次の定義に基づいています:
obclient> CREATE TABLE tbl(col1 INT PRIMARY KEY, col2 INT,col3 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 INT,col3 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE tbl3(col1 INT PRIMARY KEY, col2 INT,col3 INT);
Query OK, 0 rows affected
単一テーブルへの挿入:テーブル
tbl1に2行のデータを挿入します。obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (1, 10, 100), (2, 20, 200); Query OK, 2 row affected obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | +------+------+------+ 2 rows in set単一テーブルへの挿入:サブクエリに直接データを挿入します。
obclient>INSERT INTO tbl1 (col1, col2, col3) SELECT col1 + 2, col2 + 5, col3 + 10 FROM tbl1; Query OK, 2 row affected obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | | 3 | 15 | 110 | | 4 | 25 | 210 | +------+------+------+ 4 rows in set単一テーブルへの挿入:
RETURNING句を含みます。obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (5, 50, 500), (6, 60, 600) RETURNING col1; +------+ | COL1 | +------+ | 5 | | 6 | +------+ 2 rows in set obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | | 3 | 15 | 110 | | 4 | 25 | 210 | | 5 | 50 | 500 | | 6 | 60 | 600 | +------+------+------+ 6 rows in set複数テーブルへの通常の挿入:テーブル
tbl3に少なくとも1行のデータが存在する場合、テーブルtbl1に1行のデータ (7,8,9) を挿入し、テーブルtbl2に1行のデータ (10,11,12) を挿入します。obclient> INSERT ALL INTO tbl1 VALUES(7,8,9) INTO tbl2 VALUES(10,11,12) SELECT * FROM tbl3 WHERE ROWNUM< 2; Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | | 3 | 15 | 110 | | 4 | 25 | 210 | | 5 | 50 | 500 | | 6 | 60 | 600 | | 7 | 8 | 9 | +------+------+------+ 7 rows in set obclient> SELECT * FROM tbl2; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 10 | 11 | 12 | +------+------+------+ 1 row in set条件付き複数テーブルへの挿入:
INSERT ALLを使用して、テーブルtblのcol2の値が1より大きい場合、テーブルtbl1にデータ (10,11,12) を挿入します。テーブルtblのcol3の値が1より大きい場合、テーブルtbl2にデータ (22,23,24) を挿入します。いずれの条件も満たされない場合は、テーブルtbl1にデータ (33,34,35) を挿入します。obclient> INSERT INTO tbl VALUES(1,2,3); Query OK, 1 row affected obclient>INSERT ALL WHEN col2 > 1 THEN INTO tbl1 VALUES(10,11,12) WHEN col3 > 1 THEN INTO tbl2 VALUES(22,23,24) ELSE INTO tbl1 VALUES(33,34,35) SELECT col2,col3 FROM tbl; Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | | 3 | 15 | 110 | | 4 | 25 | 210 | | 5 | 50 | 500 | | 6 | 60 | 600 | | 7 | 8 | 9 | | 10 | 11 | 12 | +------+------+------+ 8 rows in set obclient> SELECT * FROM tbl2; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 10 | 11 | 12 | | 22 | 23 | 24 | +------+------+------+ 2 rows in set条件付き複数テーブルへの挿入:
INSERT FIRSTを使用して、テーブルtblのcol2の値が1より大きい場合、テーブルtbl1にデータ (14,15,16) を挿入し、テーブルtbl2にデータ (40,41,42) を挿入します。テーブルtblのcol3の値が1より大きい場合、テーブルtbl2にデータ (25,26,27) を挿入します。いずれの条件も満たされない場合は、テーブルtbl1にデータ (35,36,37) を挿入します。obclient>INSERT ALL WHEN col2 > 1 THEN INTO tbl1 VALUES(14,15,16) INTO tbl2 VALUES(40,41,42) WHEN col3 > 1 THEN INTO tbl2 VALUES(25,26,27) ELSE INTO tbl1 VALUES(35,36,37) SELECT col2,col3 FROM tbl; Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0 obclient> SELECT * FROM tbl1; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 1 | 10 | 100 | | 2 | 20 | 200 | | 3 | 15 | 110 | | 4 | 25 | 210 | | 5 | 50 | 500 | | 6 | 60 | 600 | | 7 | 8 | 9 | | 10 | 11 | 12 | | 14 | 15 | 16 | +------+------+------+ 9 rows in set obclient> SELECT * FROM tbl2; +------+------+------+ | COL1 | COL2 | COL3 | +------+------+------+ | 10 | 11 | 12 | | 22 | 23 | 24 | | 25 | 26 | 27 | | 40 | 41 | 42 | +------+------+------+ 4 rows in setdirectヒントの load_mode パラメータを使用して、増分ダイレクトロードを指定します。obclient [SYS]> INSERT /*+ direct(true, 0, 'inc_replace') enable_parallel_dml parallel(2) */ INTO tbl2 SELECT * FROM tbl1;実行結果は次のとおりです:
Query OK, 8 rows affected Records: 8 Duplicates: 0 Warnings: 0パーティションのダイレクトロードを指定します。 テーブル
tbl1とテーブルtbl2のパーティションルールは次のとおりと仮定します:partition p0 values less than (10) subpartition p0_1 values less than (5) subpartition p0_2 values less than (10) partition p1 values less than (20) subpartition p1_1 values less than (15) subpartition p1_2 values less than (20)プライマリパーティションのダイレクトロードを指定します
insert /*+ enable_parallel_dml parallel(3) append */ into tbl2 partition(p0, p1) select * from tbl1 partition(p0, p1);セカンダリパーティションのダイレクトロードを指定します
insert /*+ enable_parallel_dml parallel(3) append */ into tbl2 partition(p0sp0_1, p1sp1_1) select * from tbl1 partition(p0sp0_1, p1sp1_1);