[+/-]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] VALUES ({expr
| DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
または:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
SETcol_name
={expr
| DEFAULT}, ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
または:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
INSERT
は既存テーブルに新しい行を挿入します。INSERT
... VALUES
と INSERT ... SET
型のステートメントは、明示的に指定された値に基づいて行を挿入します。INSERT
... SELECT
型は別のテーブルから選択された行を挿入します。INSERT
... SELECT
については
項12.2.4.1. 「INSERT ... SELECT
構文」
でさらに詳しく説明されています。
古い行に上書きする為に、INSERT
の代わりに REPLACE
を利用する事ができます。REPLACE
は、古い行を複製する固有キー値を含む新しい行の取り扱いの中では
INSERT IGNORE
と同等になります。新しい行は捨てられるのではなく、古い行を置き換えるのに利用されます。詳しくは
項12.2.6. 「REPLACE
構文」 を参照してください。
tbl_name
は行が挿入されるべきテーブルです。ステートメントが値を提供しなければいけないカラムは次のように指定する事ができます。
テーブル名の後にカンマで区切られたカラム名のリストを提供する事ができます。この場合、名前が付けられた各カラムの値には
VALUES
リストか
SELECT
ステートメントが与えられなければいけません。
もし INSERT ... VALUES
か
INSERT ... SELECT
にカラム名のリストを指定しなければ、VALUES
リストか SELECT
ステートメントがテーブル内全てのカラムの値を提供する必要があります。もしテーブル内のカラムの順番がわからなければ、それを見つける為に
DESCRIBE
を利用してください。
tbl_name
SET
条項はカラム名を明示的に指示します。
カラム値を与える方法はいくつかあります。
もしストリクト SQL モードを利用していない場合、値を明示的に与えられていないカラムはそのデフォルト値(明示的、または暗黙の)に設定されます。例えば、もしテーブル内の全てのカラムに名前を付けないカラムのリストを指定すると、名づけられていないカラムはそのデフォルト値に設定されます。デフォルト値の割り当てについては 項10.1.4. 「データタイプデフォルト値」 で説明しています。項1.8.6.2. 「無効値の制約」 もご参照ください。
もし、デフォルト値を持たない全てのカラムの値を明示的に指定しない限りエラーを発生させる
INSERT
ステートメントが必要であれば、ストリクト
モードを利用する必要があります。詳しくは
項4.2.6. 「SQL モード」
を参照してください。
明示的にカラムをそのデフォルト値に設定するには、キーワード
DEFAULT
を利用してください。これはテーブル内の各カラムの値を持たない不完全な
VALUES
リストの書き込みを防ぐ事ができるので、一部を除く全てのカラムに値を割り当てる
INSERT
ステートメントの書き込みを簡単にします。そうでなければ、VALUES
リスト内のそれぞれの値に対応するカラム名のリストを書かなければいけません。
また、与えられたカラムのデフォルト値を生成する式の中で利用されるより一般的な形として、DEFAULT(
を利用する事もできます。
col_name
)
もしカラム リストと VALUES
リストの両方が空なら、INSERT
は各カラム
セットを利用してそのデフォルト値に行を作成します。
INSERT INTO tbl_name
() VALUES();
ストリクト モードでは、もしどのカラムもデフォルト値を持っていなければエラーが発生します。そうでなければ、MySQL は明示的に指定されたデフォルト値を持たない全てのカラムに対して暗黙のデフォルト値を利用します。
カラム値を提供する為に
expr
式を指定する事ができます。もし式のタイプがカラムのタイプに合わなければ、タイプの変換が行われる可能性があり、そしてデータのタイプによっては、与えられた値の変換が別の挿入値を生み出す事があります。例えば、文字列
'1999.0e-2'
を、INT
、FLOAT
、DECIMAL(10,6)
、または
YEAR
カラムに挿入すると、それぞれ
1999
、19.9921
、19.992100
、そして
1999
が挿入される事になります。INT
と YEAR
カラムに格納された値が 1999
である理由は、文字列から整数への変換時には、文字列の最初の部分の、有効な整数や年として判断される部分だけを見るからです。浮動小数点と固定小数点カラムに対しては、文字列から浮動小数点への変換時には、文字列全体を有効な浮動小数点として判断します。
expr
式は、値のリストに早いうちに設定された全てのカラムを参照する事ができます。例えば、col2
の値は、既に割り当てられた
col1
を参照する事ができるので、上記のような事が可能なのです。
INSERT INTO tbl_name
(col1,col2) VALUES(15,col1*2);
しかし、col1
の値は、col1
の後で割り当てられた col2
を参照する為、次のような物は正当ではありません。
INSERT INTO tbl_name
(col1,col2) VALUES(col2*2,15);
1つの例外が AUTO_INCREMENT
値を持つカラムに関係しています。別の値の割り当て後に
AUTO_INCREMENT
値が発生するので、その割り当ての中での
AUTO_INCREMENT
カラムへの参照は
0
を返すのです。
VALUES
構文を利用する
INSERT
ステートメントは複数行を挿入する事ができます。これをする為には、それぞれが括弧で囲まれカンマで区切られている、カラム値の複数リストを含んでください。例:
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
各行の値のリストは括弧で囲まれている必要があります。次のステートメントは、カラム名の数とリストの中の値の数が合わない為、不正となります。
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3,4,5,6,7,8,9);
INSERT
の行に影響された値は
mysql_affected_rows()
C API
関数を利用して取得できます。詳しくは
項23.2.3.1. 「mysql_affected_rows()
」
を参照してください。
もし INSERT ... VALUES
ステートメントを複数値リストか INSERT
... SELECT
と共に利用すると、そのステートメントはこのフォーマットで文字列情報を戻します。
Records: 100 Duplicates: 0 Warnings: 0
Records
はステートメントによって生成された行数を指示します。(Duplicates
がゼロ以外の数値になりえる為、実際に挿入された行数でなければいけないという訳ではありません。)既存の固有インデックス値を複製するので、Duplicates
は挿入できなかった行数を指示します。Warnings
は、何らかの形で問題があった、カラム値挿入の試みの回数を指示します。警告は次のような条件時に発生します。
NOT NULL
を宣言していたカラムに NULL
を挿入する。複合行 INSERT
ステートメントや INSERT INTO ...
SELECT
ステートメントに対しては、カラムはカラム
データ
タイプの暗黙のデフォルト値に設定されます。数値タイプ、文字列タイプの空の文字列(''
)、そして日付、時間タイプの
「ゼロ」 値に対してのこの値は
0
です。サーバは単列を戻すかどうかを確認する為に
SELECT
からの結果セットを検査しない為、INSERT
INTO ... SELECT
ステートメントは複合行挿入と同じ方法で扱われます。(単列
INSERT
に対しては、NULL
が NOT
NULL
カラムに挿入された時、警告は発生しません。代わりに、ステートメントはエラーになり失敗します。)
数値カラムを、範囲外の値に設定する。値はその範囲の終点に一番近いところでクリップされます。
数値カラムに '10.34 a'
のような値を割り当てる。後続の非数値テキストは取り除かれ、残りの数値部分が挿入されます。もし文字列値がその最初の部分に数値を持たない場合は、そのカラムは
0
に設定されます。
文字列を、カラムの最大長さを上回る文字列カラムに
(CHAR
、VARCHAR
、TEXT
、または
BLOB
)挿入する。値はカラムの最大長さまで切り捨てられます。
日付や時間カラムに不正である値を挿入する。カラムはそのタイプにとって適正であるゼロの値に設定されます。
もしC API
を利用していれば、mysql_info()
関数を呼び出す事で、情報文字列を得ることができます。詳しくは
項23.2.3.35. 「mysql_info()
」 を参照してください。
もし AUTO_INCREMENT
カラムを持つテーブルに INSERT
が行を挿入すれば、SQL
LAST_INSERT_ID()
関数を利用する事でそのカラムに利用される値を見つける事ができます。C
API の内部から、mysql_insert_id()
関数を利用してください。しかし、2つの関数がいつでも全く同じ働きをする訳ではない事に注意してください。AUTO_INCREMENT
カラムに関しての、INSERT
ステートメントの動作の更なる情報は
項11.10.3. 「情報関数」 と
項23.2.3.37. 「mysql_insert_id()
」 で紹介されています。
INSERT
ステートメントは次の修飾因子をサポートします。
もし DELAYED
キーワードを利用すると、サーバはバッファに挿入される行を置くので、INSERT
DELAYED
ステートメントを発行するクライアントは即座に再開されます。もしテーブルが使用中であれば、サーバが行を保持します。テーブルがフリーであればサーバは行の挿入を始め、新しいリクエストがないかを調べる為に定期的にテーブルを確認します。もしあれば、遅れた行の列はテーブルが再度フリーになるまでサスペンドされます。項12.2.4.2. 「INSERT DELAYED
構文」
を参照してください。
サーバは、INSERT ... SELECT
か
INSERT ... ON DUPLICATE KEY UPDATE
に対して
DELAYED
を無視します。
もし LOW_PRIORITY
キーワードを利用すると、別のクライアントがテーブルからの読み込みをしなくなるまで、INSERT
の実行が遅れます。これには、既存クライアントが読み込みをしている最中、そして
INSERT LOW_PRIORITY
ステートメントが待っている最中に読み込みを始めてしまう別のクライアントが含まれます。しかし、INSERT
LOW_PRIORITY
ステートメントを発行するクライアントがリード
ヘビー環境の中で長時間(または永遠に)待つ事は可能です。(これは、クライアントにそのまま作業を続けさせる
INSERT DELAYED
とは逆の機能です。並列挿入ができなくなるので、通常
LOW_PRIORITY
は
MyISAM
テーブルと一緒には利用されません。詳しくは
項6.3.3. 「同時挿入」
を参照してください。
もし HIGH_PRIORITY
を指定すると、サーバが
--low-priority-updates
オプションでスタートされている場合その効果が無効になります。また、並行挿入も利用されなくなります。
もし IGNORE
キーワードを利用したら、INSERT
ステートメントの実行中に起きたエラーは警告として扱われます。例えば、IGNORE
が無いと、テーブル内に既存の
UNIQUE
インデックスや
PRIMARY KEY
値を複製する行に複製キー
エラーが起き、そのステートメントは異常終了されます。IGNORE
を利用すると、行の挿入はされませんが、エラーも発行されません。もし
IGNORE
が指定されなければ、データ変換はステートメントに関するエラーを引き起こします。IGNORE
を利用すると、不正な値は一番近い値に調節されて挿入され、警告が発生されますがステートメントは異常終了しません。いくつのテーブルが実際に挿入されたのか、mysql_info()
C API 関数を利用して調べる事ができます。
もし ON DUPLICATE KEY UPDATE
を指定し、UNIQUE
インデックスか PRIMARY KEY
内で複製値を引き起こす行が挿入されると、古い行の
UPDATE
が実行されます。詳しくは
項12.2.4.3. 「INSERT ... ON DUPLICATE KEY UPDATE
構文」
を参照してください。