MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

13.2.6 INSERT ステートメント

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ...
      |
      VALUES row_constructor_list
    }
    [AS row_alias[(col_alias [, col_alias] ...)]]
    [ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [AS row_alias[(col_alias [, col_alias] ...)]]
    SET assignment_list
    [ON DUPLICATE KEY UPDATE assignment_list]

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    [AS row_alias[(col_alias [, col_alias] ...)]]
    {SELECT ... | TABLE table_name}
    [ON DUPLICATE KEY UPDATE assignment_list]

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

row_constructor_list:
    ROW(value_list)[, ROW(value_list)][, ...]

assignment:
    col_name = [row_alias.]value

assignment_list:
    assignment [, assignment] ...

INSERT は、既存のテーブルに新しい行を挿入します。 INSERT ... VALUESINSERT ... VALUES ROW() および INSERT ... SET 形式のステートメントは、明示的に指定された値に基づいて行を挿入します。 INSERT ... SELECT 形式は、別の 1 つまたは複数のテーブルから選択された行を挿入します。 MySQL 8.0.19 以降で INSERT ... TABLE を使用して、単一のテーブルから行を挿入することもできます。 INSERTON DUPLICATE KEY UPDATE 句を使用すると、行が挿入されて UNIQUE インデックスまたは PRIMARY KEY で値が重複する場合に、既存の行を更新できます。 MySQL 8.0.19 以降では、1 つ以上のオプションのカラムアライスを持つ行エイリアスを ON DUPLICATE KEY UPDATE で使用して、挿入する行を参照できます。

INSERT ... SELECT および INSERT ... ON DUPLICATE KEY UPDATE の詳細は、セクション13.2.6.1「INSERT ... SELECT ステートメント」 および セクション13.2.6.2「INSERT ... ON DUPLICATE KEY UPDATE ステートメント」 を参照してください。

MySQL 8.0 では、DELAYED キーワードは受け入れられますが、サーバーでは無視されます。 この理由については、セクション13.2.6.3「INSERT DELAYED ステートメント」 を参照してください。

テーブルに挿入するには、そのテーブルに対する INSERT 権限が必要です。 ON DUPLICATE KEY UPDATE 句が使用されていて、重複キーのために代わりに UPDATE が実行される場合、このステートメントには、更新されるカラムに対する UPDATE 権限が必要です。 読み取られるが、変更されないカラムの場合は、SELECT 権限のみが必要です (ON DUPLICATE KEY UPDATE 句にある col_name=expr 割り当ての右側でのみ参照されるカラムの場合など)。

パーティションテーブルに挿入する場合、新しい行を受け入れるパーティションおよびサブパーティションを制御できます。 PARTITION オプションは、テーブルのパーティションまたはサブパーティション (あるいはその両方) のカンマ区切りの名前のリストを取ります。 特定の INSERT ステートメントによって挿入される行がリストされているいずれかのパーティションに一致しない場合、INSERT ステートメントはFound a row not matching the given partition setエラーで失敗します。 詳細および例については、セクション24.5「パーティション選択」を参照してください。

tbl_name は、行が挿入されるテーブルです。 ステートメントが値を提供するカラムを次のように指定します:

カラム値は、次のいくつかの方法で指定できます。

VALUES 構文を使用する INSERT ステートメントは複数の行を挿入できます。 これを行うには、カンマで区切られたカラム値の複数のリストをカッコで囲み、カンマで区切って含めます。 例:

INSERT INTO tbl_name (a,b,c)
    VALUES(1,2,3), (4,5,6), (7,8,9);

各値リストには、行ごとに挿入されるのと同じ数の値が含まれている必要があります。 次のステートメントは、それぞれ 3 つの値のリストではなく、9 つの値のリストが 1 つ含まれているため、無効です:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3,4,5,6,7,8,9);

このコンテキストでは、VALUEVALUES のシノニムです。 値リストの数やリスト当たりの値の数については何も意味しません。 リストごとの値の数に関係なく、単一の値リストまたは複数のリストのいずれかを使用できます。

VALUES ROW() 構文を使用する INSERT ステートメントでは、複数の行を挿入することもできます。 この場合、各値リストは、次のように ROW() (行コンストラクタ) 内に含まれている必要があります:

INSERT INTO tbl_name (a,b,c)
    VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9);

INSERT の影響を受ける行の値は、ROW_COUNT() SQL 関数または mysql_affected_rows() C API 関数を使用して取得できます。 セクション12.16「情報関数」およびmysql_affected_rows()を参照してください。

複数の値リスト、INSERT ... SELECT または INSERT ... TABLEINSERT ... VALUES または INSERT ... VALUES ROW() を使用する場合、このステートメントは次の形式で情報文字列を返します:

Records: N1 Duplicates: N2 Warnings: N3

C API を使用している場合は、mysql_info() 関数を呼び出すことによって情報文字列を取得できます。 mysql_info()を参照してください。

Records は、このステートメントによって処理された行数を示します。 (これは、Duplicates が 0 以外であることがあるため、必ずしも実際に挿入された行数ではありません。) Duplicates は、何らかの既存の一意のインデックス値を複製しているために挿入できなかった行数を示します。 Warnings は、何らかの点で問題があったカラム値を挿入するための試行回数を示します。 警告は、次のいずれかの条件で発生する場合があります。

INSERT ステートメントは、次の修飾子をサポートします。