INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
INSERT ... SELECT
を利用すると、1つ、または複数のテーブルから多くの行をすばやく挿入する事ができます。例:
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
次の条件は INSERT ... SELECT
ステートメントを保持します。
複製キー違反を引き起こす行を無視する為に
IGNORE
を指定してください。
DELAYED
は INSERT ...
SELECT
と共に無視されます。
INSERT
ステートメントの対象テーブルはクエリの
SELECT
部のFROM
条項内に現れます。(これは MySQL
の古いバージョンでは不可能でした。)この場合、MySQL
は行を保持する為に SELECT
からテンポラリ
テーブルを作成し、そして対象テーブルにそれらの行を挿入します。
AUTO_INCREMENT
カラムは通常通り機能します。
バイナリ
ログが元テーブルを再作成する為に利用できる事を保障する為に、MySQL
は INSERT ... SELECT
ステートメントへの並列挿入を許可しません。
現在は、サブクエリの中で1つのテーブルに挿入し、同じテーブルから選択する事はできません。
SELECT
と INSERT
が同じテーブルを参照した時に、曖昧なカラム参照の問題を防ぐ為に、SELECT
部分で利用される各テーブルに固有のエイリアスを与え、その部分の中でのカラム名を適切なエイリアスに限定してください。
ON DUPLICATE KEY UPDATE
の値部分の中で、SELECT
部分の中で GROUP BY
を利用しない限り、別のテーブル内でカラムの参照をする事ができます。値の部分で非固有カラム名を指定しなければいけない、という副作用が1つあります。