説明
このステートメントは、テーブルに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]):オプション。Hintを使用してダイレクトロード機能を有効にします。注意
ダイレクトロードタスクの実行中は、OceanBaseデータベースのアップグレード操作を同時に行うことは推奨されません。これにより、ダイレクトロードタスクが失敗する可能性があります。
APPEND:デフォルトでは、使用されるDIRECT(true, 0)と同等であり、オンライン統計情報収集(GATHER_OPTIMIZER_STATISTICSHint)機能も実現できます。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_dmlHintとparallelHintは組み合わせて使用する必要があります。ただし、ターゲットテーブルのスキーマでテーブルレベルの並列度が指定されている場合は、enable_parallel_dmlHintのみを指定する必要があります。
NO_DIRECT:単一のSQL文に対してダイレクトロードを強制的に無視するようにします。入力されたSQLにこのHintが含まれている場合、そのステートメント全体で他のダイレクトロードHintは無視され、通常のインポートが実行されます。
Hintの詳細については、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