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
型のカラムへの、そのカラムの最大長を超える文字列の挿入。この場合、値はカラムの最大長に合わせて切り捨てられる。
日付または時刻型のカラムへの、そのカラム型に不適切な値の挿入。この場合、カラムの値はその型に対応するゼロ値に設定される。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.