mysql - multiple - on duplicate key update php
MySQL LOAD DATA INFILE con ON DUPLICATE KEY UPDATE (2)
Estos pasos se pueden usar para emular esta funcionalidad:
1) Crea una nueva tabla temporal.
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2) Opcionalmente, suelte todos los índices de la tabla temporal para acelerar las cosas.
SHOW INDEX FROM temporary_table;
DROP INDEX `PRIMARY` ON temporary_table;
DROP INDEX `some_other_index` ON temporary_table;
3) Cargue el CSV en la tabla temporal
LOAD DATA INFILE ''your_file.csv''
INTO TABLE temporary_table
FIELDS TERMINATED BY '','' OPTIONALLY ENCLOSED BY ''"''
(field1, field2);
4) Copie los datos usando ON DUPLICATE KEY UPDATE
SHOW COLUMNS FROM target_table;
INSERT INTO target_table
SELECT * FROM temporary_table
ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);
5) Eliminar la tabla temporal
DROP TEMPORARY TABLE temporary_table;
El uso de SHOW INDEX FROM
y SHOW COLUMNS FROM
este proceso puede automatizarse para cualquier tabla dada.
Para cargar grandes cantidades de datos en MySQL, LOAD DATA INFILE es, de lejos, la opción más rápida. Desafortunadamente, aunque esto se puede utilizar de una manera INSERT IGNORE o REPLACE funciona, ON DUPLICATE KEY UPDATE no es compatible actualmente.
Sin embargo, ON DUPLICATE KEY UPDATE
tiene ventajas sobre REPLACE
. Este último hace un borrado y un inserto cuando existe un duplicado. Esto trae sobrecarga para la administración de claves. Además, los identificadores de autoincrement no se mantendrán iguales en un reemplazo.
¿Cómo se puede emular ON DUPLICATE KEY UPDATE
cuando se utiliza LOAD DATA INFILE?
podemos reemplazar primero (dos pasos) con la consulta individual inferior en el procedimiento compartido por (Jan).
1) y 2) podemos crear una nueva tabla con la misma estructura de referencia y sin ningún índice.
CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1 = 0;
En lugar de..
1) Crea una nueva tabla temporal.
CREATE TEMPORARY TABLE temporary_table LIKE target_table;
2) Opcionalmente, suelte todos los índices de la tabla temporal para acelerar las cosas.
MOSTRAR ÍNDICE DE tabla_temporal; DROP INDEX PRIMARY
ON temporary_table; ÍNDICE DE CAÍDA some_other_index
ON temporary_table;