INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ((expression | DEFAULT),...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
または INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
または INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=(expression | DEFAULT), ...
[ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
INSERT ステートメントでは、既存のテーブルに新しいレコードが挿入されます。INSERT ... VALUES 形式の INSERT では、明示的に指定した値に基づくレコードが挿入されます。INSERT ... SELECT 形式の INSERT では、別の 1 つまたは複数のテーブルから選択されたレコードが挿入されます。複数の値のリストを持つ INSERT ... VALUES 形式は、MySQL バージョン 3.22.5 以降でサポートしています。col_name=expression 構文は MySQL バージョン 3.22.10 以降でサポートしています。
tbl_name には、レコードを挿入するテーブルを指定します。カラム名のリストまたは SET 節には、そのステートメントで値を指定する対象のカラムを指定します。
INSERT ... VALUES または INSERT ... SELECT でカラムリストを指定しない場合、VALUES() リストまたは SELECT で、テーブルのすべてのカラムの値を提供する必要がある。テーブル内のカラムの順序がわからない場合は、DESCRIBE tbl_name を使用して順序を調べる。
値が明示的に指定されていないカラムは、そのカラムのデフォルトに設定される。たとえば、カラムリストでテーブルのすべのカラムが指定されていない場合、指定されていないカラムはそのデフォルト値に設定される。デフォルト値の割り当てについては、項6.5.3. 「CREATE TABLE 構文」 で説明している。
キーワード DEFAULT を使用して、カラムにデフォルト値を設定することもできる(MySQL 4.0.3 の新機能)。この場合、不完全な VALUES() リスト(テーブル内のすべてのカラムの各値を含んでいないリスト)を記述しなくてすむため、一部のわずかなカラムを除いたすべてのカラムに値を割り当てる INSERT ステートメントを書きやすくなる。
このキーワードを使用しない場合、VALUES() リストの各値に対応するカラム名のリストを記述しなければならない。
MySQL では、常にすべてのフィールドにデフォルト値がある。デフォルト値の存在は、MySQL がトランザクションテーブルと非トランザクションテーブルのどちらも処理できるようにするための必要条件となっている。
MySQL では、フィールド内容のチェックはデータベースサーバではなくアプリケーション側で行う、という見解に立っている。
expression では、値リストに先に設定された任意のカラムを参照することができる。たとえば、次のように記述できる。
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
しかし、次のようには記述できない。
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
キーワード DELAYED が指定されていると、サーバはレコードをバッファに挿入する。その後、INSERT DELAYED ステートメントを発行したクライアントは処理を続行することができる。テーブルが使用されていると、サーバはレコードを保持する。テーブルが解放されると、サーバはレコードの挿入を開始し、そのテーブルに対する新しい読み取り要求がないか定期的にチェックする。新しい読み取り要求があると、そのテーブルが再び解放されるまで、遅延されたレコードのキューの処理は中断される。
キーワード LOW_PRIORITY が指定されている場合、他のクライアントによるそのテーブルからの読み取りがなくなるまで、INSERT の実行は遅らされる。これには、既存のクライアントの読み取り中、および INSERT LOW_PRIORITY ステートメントの待機中に読み取りを開始した他のクライアントも含まれる。したがって、読み取り過多な環境の場合、INSERT LOW_PRIORITY ステートメントを発行したクライアントは長時間(または永続的に)待機させられることがある(それに対して INSERT DELAYED では、クライアントは直ちに処理を続行することができる)。See 項6.4.3.2. 「INSERT DELAYED 構文」注意: LOW_PRIORITY では同時挿入が無効になるため、このオプションは通常 MyISAM テーブルに対しては使用しない。 See 項7.1. 「MyISAM テーブル」。
多くのレコードの INSERT でキーワード IGNORE が指定されていると、テーブルの既存の PRIMARY または UNIQUE キーと重複するレコードはすべて無視され、挿入されない。IGNORE が指定されていない場合に既存のキー値を重複して持つレコードがあると、挿入処理が中断される。C API 関数 mysql_info() では、テーブルに挿入されたレコード数を調べることができる。
ON DUPLICATE KEY UPDATE 節(MySQL 4.1.0 の新機能)が指定されている場合に、PRIMARY または UNIQUE キーでの重複値の生成を招くレコードが挿入されると、古いレコードの UPDATE が実行される。次に例を示す。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
このコマンドでは、a が UNIQUE として宣言されていて、かつすでに 1 度、値 1 を保持している場合、次のコマンドと同じになる。
mysql> UPDATE table SET c=c+1 WHERE a=1;
注意: カラム b も一意である場合、UPDATE コマンドは次のようになる。
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
a=1 OR b=2 が複数のレコードに一致する場合、1 つのレコードだけが更新される。通常、複数の UNIQUE キーを持つテーブルに対しては ON DUPLICATE KEY 節を使用しないようにする。
MySQL 4.1.1 以降では、関数 VALUES(col_name) を使用して、INSERT ... UPDATE コマンドの INSERT 部分のカラム値を参照できる。これは、重複キーのコンフリクトがない場合に挿入される値である。この関数は複数行の挿入時に特に役立つ。当然、VALUES() 関数は INSERT ... UPDATE コマンドでのみ意味を持ち、それ以外のコマンドで使用した場合は NULL が返される。
次に例を示す。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
上のコマンドは次のコマンドと同じである。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
ON DUPLICATE KEY UPDATE が指定されている場合、DELAYED オプションは無視される。
MySQL のコンフィギャ時に DONT_USE_DEFAULT_FIELDS オプションが指定されている場合、NULL 以外の値を必要とするすべてのカラムに明示的に値を指定しないと、INSERT ステートメントでエラーが生成される。
See 項2.3.3. 「一般的な configure オプション」。
AUTO_INCREMENT カラムに使用されている値は、mysql_insert_id 関数を使用して確認することができる。
See 項11.1.3.32. 「mysql_insert_id()」。
INSERT ... SELECT または INSERT ... VALUES ステートメントを複数の値のリスト付きで使用する場合は、C API 関数 mysql_info() を使用してクエリに関する情報を取得することができます。情報文字列の形式は次のとおりです。
Records: 100 Duplicates: 0 Warnings: 0
Duplicates は、特定の既存のユニークインデックス値と重複することになるため挿入されなかったレコード数を表します。 Warnings は、何らかの問題があるカラム値を挿入しようとした回数を表します。Warnings(警告)は次のいずれかの条件の下に発生します。
NOT NULL として宣言されているカラムへの NULL の挿入。
この場合、カラムにはそのカラム型に対応するデフォルト値が設定される。
つまり、数値型のカラムでは 0、文字列型のカラムでは空の文字列('')、日付と時刻型のカラムでは ``ゼロ'' 値が適用される。
数値型のカラムへの、そのカラムの値の範囲を超える値の設定。 この場合、値は範囲の最大値または最小値に切り落とされる。
数値型のカラムへの '10.34 a' などの値の設定。この場合、後続のガーベジは除去され、残りの数値の部分だけが挿入される。値が数値として意味をなさない場合、カラムの値は 0 に設定される。
CHAR 型、VARCHAR 型、TEXT 型、または BLOB 型のカラムへの、そのカラムの最大長を超える文字列の挿入。この場合、値はカラムの最大長に合わせて切り捨てられる。
日付または時刻型のカラムへの、そのカラム型に不適切な値の挿入。この場合、カラムの値はその型に対応するゼロ値に設定される。