2012-04-20 43 views
41

Tengo una tabla que tiene este aspecto:Importar CSV para actualizar sólo una columna en la tabla

products 
-------- 
id, product, sku, department, quantity 

hay aproximadamente 800.000 entradas en esta tabla. He recibido un nuevo archivo CSV que actualiza todas las cantidades de cada producto, por ejemplo:

productA, 12 
productB, 71 
productC, 92 

Así que hay aproximadamente 750.000 actualizaciones (50.000 productos tenían ningún cambio en la cantidad).

Mi pregunta es, ¿Cómo se importa este CSV para actualizar sólo la cantidad sede fuera de la product (única), pero dejan los sku, department, y otros campos solo? Sé cómo hacer esto en PHP al recorrer el CSV y ejecutar una actualización para cada línea, pero parece ineficaz.

Respuesta

108

Puede utilizar LOAD DATA INFILE a granel cargar los 800.000 filas de datos en una tabla temporal, a continuación, utilizar múltiples tablas UPDATE sintaxis para unirse a su tabla existente a la tabla temporal y actualizar los valores de cantidad.

Por ejemplo:

CREATE TEMPORARY TABLE your_temp_table LIKE your_table; 

LOAD DATA INFILE '/tmp/your_file.csv' 
INTO TABLE your_temp_table 
FIELDS TERMINATED BY ',' 
(id, product, sku, department, quantity); 

UPDATE your_table 
INNER JOIN your_temp_table on your_temp_table.id = your_table.id 
SET your_table.quantity = your_temp_table.quantity; 

DROP TEMPORARY TABLE your_temp_table; 
+4

impresionante - eso es una respuesta muy sofisticado! – DocJones

+2

+1 para la respuesta más simple y precisa. – diEcho

+0

@lke Walker, ¿Puedes responder mi pregunta? Http://stackoverflow.com/questions/21495600/import-csv-to-update-rows-tabletable –

5

Me cargar los datos de actualización en una tabla separada UPDATE_TABLE y llevar a cabo una actualización dentro de MySQL usando:

UPDATE PRODUCTS P SET P.QUANTITY=(
    SELECT UPDATE_QUANTITY 
    FROM UPDATE_TABLE 
    WHERE UPDATE_PRODUCT=P.PRODUCT 
) 

No tengo un MySQL que nos ocupa en este momento, por lo que puede comprobar la sintaxis perfectamente, podría Si necesita agregar un LIMIT 0,1 al interior SELECT.

Cuestiones relacionadas