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
から一時テーブルを作成し、そして対象テーブルにそれらの行を挿入します。ただし、TEMPORARY
テーブルを同じステートメント内で 2
回参照することはできないため、t
が TEMPORARY
テーブルのときに INSERT
INTO t ... SELECT ... FROM t
を使用できない点は引き続き残ります
(TEMPORARY
Table Problems を参照)。
AUTO_INCREMENT
カラムは通常通り機能します。
バイナリログが元テーブルを再作成するために利用できることを保障するために、MySQL
は
INSERT
... SELECT
ステートメントへの並列挿入を許可しません。
現在は、サブクエリーの中で 1 つのテーブルに挿入し、同じテーブルから選択することはできません。
SELECT
と
INSERT
が同じテーブルを参照している場合のあいまいなカラム参照の問題を回避するには、SELECT
部分で使用されている各テーブルの一意のエイリアスを指定し、その部分にあるカラム名を適切なエイリアスで修飾します。
ON DUPLICATE KEY UPDATE
の値部分の中で、SELECT
部分の中で GROUP
BY
を利用しないかぎり、別のテーブル内でカラムの参照をすることができます。1
つの副作用として、値の部分にある一意でないカラム名を修飾しなければならない点があります。