説明
このステートメントは、テーブルに1つまたは複数のレコードを追加するために使用します。
使用上の制限と注意事項
サブクエリに対して直接挿入操作を行うことはサポートされていません。例えば、INSERT INTO (SELECT * FROM t1) VALUES(1, 1) のような操作はできません。
権限要件
INSERTステートメントを実行するには、対象テーブルに対するINSERT権限が必要です。INSERT ... SELECT ...ステートメントを実行するには、対象テーブルに対するINSERT権限に加えて、ソーステーブル(SELECT句で参照されるテーブル)に対するSELECT権限も必要です。
OceanBaseデータベースの権限の詳細については、MySQLモードの権限分類を参照してください。
構文
INSERT {into_table_insert | overwrite_table_insert};
into_table_insert:
[hint_options] [IGNORE] [INTO]
single_table_insert
[ON DUPLICATE KEY UPDATE update_asgn_list]
hint_options:
[/*+ [APPEND | DIRECT(bool, int, ['load_mode'])] enable_parallel_dml PARALLEL(N) | NO_DIRECT */]
load_mode:
full
| inc
| inc_replace
single_table_insert:
table_name [PARTITION (partition_name, ...)] [(column_list)] {VALUES | VALUE} (values_list)[, (values_list) ...]
| table_name [PARTITION (partition_name, ...)] [(column_list)] select_stmt
| table_name [PARTITION (partition_name, ...)] SET update_asgn_list
column_list:
column_name [,column_name ...]
values_list:
value [,value ...]
value:
expr
| DEFAULT
update_asgn_list:
column_name = expr [,column_name = expr ...]
overwrite_table_insert:
[/*+ PARALLEL(N)*/] OVERWRITE [INTO] table_name [(column_list)] [PARTITION (partition_name, ...)] select_stmt;
パラメータの説明
パラメータ |
説明 |
|---|---|
| into_table_insert | テーブルにデータを挿入するために使用します。 |
| hint_options | オプションです。Hintオプションを指定するために使用します。詳細については、以下の hint_options を参照してください。 |
| IGNORE | オプションです。データ挿入時に発生するエラーを無視するよう指示します。 |
| INTO | オプションです。次に挿入対象が続くことを示すために使用し、省略できます。 |
| single_table_insert | テーブルへのデータ挿入方法を指定します。現在、3種類のデータ挿入方法をサポートしています。詳細については、以下の single_table_insert を参照してください。 |
| table_name | 挿入するテーブル名を指定します。 |
| PARTITION (partition_name, ...) | オプションです。データがテーブルのどのパーティションに挿入されるかを指定するために使用します。複数のパーティションに挿入する場合は、カンマ(,)で区切ります。partition_name は挿入するテーブルの指定パーティション名を表します。 |
| column_list | オプションです。データを挿入する列を指定するために使用します。複数の列を挿入する場合は、カンマ(,)で区切ります。 |
| column_name | 指定する列の列名を表します。 |
| ON DUPLICATE KEY UPDATE update_asgn_list | オプションです。重複する主キーまたは一意キーに対する処理操作を指定します。
update_asgn_list は代入文を表します。詳細については、以下の update_asgn_list を参照してください。 |
| overwrite_table_insert | クエリ結果でテーブルまたはパーティション内の既存データを上書きするために使用します。INSERT OVERWRITE SELECT ステートメントの使用方法の詳細については、データの挿入 の INSERT OVERWRITE SELECTステートメントを使用したデータの挿入 セクションを参照してください。 |
| select_stmt | SELECT 句を指定します。クエリ文の詳細については、SELECTステートメント を参照してください。 |
hint_options
[APPEND | DIRECT(bool, int, [load_mode])] enable_parallel_dml PARALLEL(N):APPEND | DIRECT(bool, int, [load_mode]):オプションです。このヒントを使用してダイレクトロード機能を有効にします。注意
ダイレクトロードタスクの実行中は、OceanBaseデータベースのアップグレード操作を同時に行うことは推奨されません。これにより、ダイレクトロードタスクが失敗する可能性があります。
APPEND:デフォルトではDIRECT(true, 0)と同等であり、オンライン統計情報収集(GATHER_OPTIMIZER_STATISTICSヒント)の機能も実現できます。DIRECT(bool, int, [load_mode]):bool:書き込むデータのソートが必要かどうかを示します。取り得る値は以下のとおりです:true:ソートが必要であることを示します。false:ソートが不要であることを示します。
int:許容される最大誤った行数を示します。load_mode:オプションパラメータで、ダイレクトロードのモードを示します。値は英字のシングルクォートで囲む必要があります。取り得る値は以下のとおりです:full:デフォルト値で、フルインポートを示します。inc:増分インポートを示し、INSERTとIGNOREの両方のセマンティクスをサポートします。inc_replace:増分インポートを示しますが、主キーの重複チェックは行いません。REPLACEセマンティクスの増分インポートに相当します。注意
load_modeの値がinc_replaceの場合、INSERTステートメントにIGNOREキーワードを含めることはできません。
INSERT INTO SELECTを使用したダイレクトロードの詳細については、ダイレクトロードの概要を参照してください。
enable_parallel_dml parallel(N):オプションです。データロードの並列度を設定します。説明
通常、
enable_parallel_dmlヒントとparallelヒントは併用して初めて並列DMLを有効にできます。ただし、対象テーブルのスキーマでテーブルレベルの並列度が指定されている場合は、enable_parallel_dmlヒントのみを指定する必要があります。
NO_DIRECT:単一のSQLがダイレクトロードを強制的に経由しないように制御します。入力されたSQLにこのヒントが含まれている場合、その文全体が他のダイレクトロード関連のヒントを無視し、通常のインポートが実行されます。
ヒントの詳細については、Optimizer Hintを参照してください。
single_table_insert
[(column_list)] {VALUES | VALUE} (values_list)[, (values_list) ...]:一連の明示的な値を対象テーブルに直接挿入します。column_list:オプションです。データを挿入する列名のリストを指定します。複数の列名はカンマ(,)で区切ります。VALUES | VALUE: 挿入する値のリストを導入するためのキーワードです。values_list: 挿入するデータ値のリストを指定します。括弧(())で囲みます。複数の値リストが可能で、値リスト間はカンマ(,)で区切ります。各値リストは1行のデータを表します。values:挿入する個々の値です。各値は1列に対応し、値はカンマ(,)で区切ります。式(expr)やDEFAULTキーワードを使用して列のデフォルト値を設定できます。
例:
テーブル
tbl1に1行のデータを挿入します。INSERT INTO tbl1(col1, col2) VALUES(1, 'A1');テーブル
tbl1に複数行のデータを挿入します。INSERT INTO tbl1(col1, col2) VALUES(2, 'A2'),(3, 'A3');
[(column_list)] select_stmt:1つまたは複数のソーステーブルからデータを選択し、クエリ結果を対象テーブルに挿入します。column_list:オプションです。データを挿入する列名のリストを指定します。複数の列名はカンマ(,)で区切ります。select_stmt: 実行するクエリステートメントを指定します。その結果が対象テーブルに挿入されます。select_stmtは結果セットを返す必要があります。クエリステートメントの具体的な構造とオプションの詳細については、SELECT ステートメントを参照してください。
例:
INSERT INTO tbl1(col1, col2) SELECT col1, col2 FROM tbl2 WHERE col2 = 'a3';SET update_asgn_list:SET句を使用して各列の値を指定し、データを対象テーブルに挿入します。update_asgn_listは代入ステートメントを表します。詳細については、後述の update_asgn_list を参照してください。例:
INSERT INTO tbl1 SET col1= 4, col2='a4';
update_asgn_list
column_name = expr [, ...]:列名が式のリストに等しいことを指定し、既存の行を更新します。複数の値ペアはカンマ(,)で区切ります。
例:
キー競合が発生した場合、対象行の
col2列の値を、元々挿入しようとした値(つまりVALUES(col2)、この例ではa2)に更新するよう指定します。INSERT INTO tbl1(col1, col2) VALUES (2, 'a2') ON DUPLICATE KEY UPDATE col2 = VALUES(col2);
例
サンプルテーブル test_tbl1 と test_tbl2 の定義は以下のとおりです:
CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 INT)
PARTITION BY KEY(col1)
(PARTITION p0,
PARTITION p1,
PARTITION p2,
PARTITION p3
);
CREATE TABLE test_tbl2(col1 INT PRIMARY KEY, col2 INT);
テーブル
test_tbl1の指定されたp0パーティションに単一行データを挿入します。INSERT INTO test_tbl1 PARTITION(p0) (col1) VALUES(5);テーブル
test_tbl1のデータを確認します:SELECT * FROM test_tbl1 PARTITION(p0);結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 5 | NULL | +------+------+ 1 row in set更新可能なビュー
vに値を挿入します。CREATE VIEW v AS SELECT * FROM test_tbl2;INSERT INTO v VALUES (1, 1);ビュー
vのデータを確認します:SELECT * FROM v;結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 1 | +------+------+ 1 row in setINSERT OVERWRITE SELECTの例:テーブル
test_tbl1にデータを挿入します。INSERT INTO test_tbl1 VALUES (1, 30),(2, 25),(3, 22);INSERT OVERWRITE SELECTステートメントを使用し、col2が25より大きい条件でtest_tbl1からデータを選択し、それらのデータをtest_tbl2に挿入して既存の内容を上書きします。INSERT OVERWRITE test_tbl2 SELECT * FROM test_tbl1 WHERE col2 > 25;データ上書き後のテーブル
test_tbl2の内容を確認します。SELECT * FROM test_tbl2;結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 30 | +------+------+ 1 row in set