mysql.h
INSERT ... SELECT
INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name [(column_list)] SELECT ...
Con INSERT ... SELECT, se pueden insertar rápidamente muchas filas en una tabla desde otra u otras tablas.
Por ejemplo:
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
En una sentencia INSERT ... SELECT se deben cumplir las siguientes condiciones :
- En versiones anteriores a MySQL 4.0.1, INSERT ... SELECT opera de forma implícita en el modo IGNORE. A partir de MySQL 4.0.1, se debe especificar IGNORE explícitamente para que se ignoren registros que puedas producir violaciones de claves duplicadas.
- No se debe usar DELAYED con INSERT ... SELECT.
- Antes de MySQL 4.0.14, la tabla destino de una sentencia INSERT no puede aparecer en la cláusula FROM de la parte SELECT de la consulta. Esta limitación se eliminó en la versión 4.0.14.
- Las columnas AUTO_INCREMENT funcionan del modo normal.
- Para asegurar que el diario binario pueda ser usado para recrear las tablas originales, MySQL no permitirá inserciones concurrentes durante un INSERT ... SELECT.
- Actualmente, no se puede insertar en una tabla y seleccionar desde la misma tabla en una subconsulta.
Se puede usar REPLACE en lugar de INSERT para sobrescribir filas viejas. REPLACE es el homólogo de INSERT IGNORE en el tratamiento de nuevas filas que contengan valores de clave úniccas que dupliquen filas existentes: Las nuevas filas se usan para reemplazar a las antiguas más que para que sean descartadas.