INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
With INSERT ...
SELECT
, you can quickly insert many rows into a table
from one or many tables. For example:
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
The following conditions hold for a
INSERT ...
SELECT
statements:
Specify
IGNORE
to ignore rows that would cause duplicate-key violations.DELAYED
is ignored withINSERT ... SELECT
.The target table of the
INSERT
statement may appear in theFROM
clause of theSELECT
part of the query. (This was not possible in some older versions of MySQL.) However, you cannot insert into a table and select from the same table in a subquery.When selecting from and inserting into a table at the same time, MySQL creates a temporary table to hold the rows from the
SELECT
and then inserts those rows into the target table. However, it remains true that you cannot useINSERT INTO t ... SELECT ... FROM t
whent
is aTEMPORARY
table, becauseTEMPORARY
tables cannot be referred to twice in the same statement (see Section C.5.7.2, “TEMPORARY
Table Problems”).AUTO_INCREMENT
columns work as usual.To ensure that the binary log can be used to re-create the original tables, MySQL does not permit concurrent inserts for
INSERT ... SELECT
statements.To avoid ambiguous column reference problems when the
SELECT
and theINSERT
refer to the same table, provide a unique alias for each table used in theSELECT
part, and qualify column names in that part with the appropriate alias.
In the values part of ON DUPLICATE KEY
UPDATE
, you can refer to columns in other tables, as
long as you do not use GROUP BY
in the
SELECT
part. One side effect is
that you must qualify nonunique column names in the values part.
The order in which rows are returned by a
SELECT
statement with no
ORDER BY
clause is not determined. This means
that, when using replication, there is no guarantee that such a
SELECT
returns rows in the same order on the
master and the slave; this can lead to inconsistencies between
them. To prevent this from occurring, you should always write
INSERT ... SELECT
statements that are to be
replicated as INSERT ... SELECT ... ORDER BY
. The choice of
column
column
does not matter as long as the
same order for returning the rows is enforced on both the master
and the slave. See also
Section 17.4.1.12, “Replication and LIMIT
”.