2012-04-20 18 views
41

Tôi có một bảng trông như thế này:Nhập CSV để cập nhật chỉ có một cột trong bảng

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

Có khoảng 800.000 mục trong bảng này. Tôi đã nhận được tệp CSV mới cập nhật tất cả số lượng của từng sản phẩm, ví dụ:

productA, 12 
productB, 71 
productC, 92 

Vì vậy, có khoảng 750.000 bản cập nhật (50.000 sản phẩm không có thay đổi về số lượng).

Câu hỏi của tôi là làm cách nào để nhập CSV này để chỉ cập nhật số lượng dựa trên product (duy nhất) nhưng chỉ để sku, department và các trường khác? Tôi biết làm thế nào để làm điều này trong PHP bằng cách lặp qua các CSV và thực hiện một bản cập nhật cho mỗi dòng duy nhất nhưng điều này có vẻ không hiệu quả.

Trả lời

108

Bạn có thể sử dụng LOAD DATA INFILE để rời nạp 800.000 dòng dữ liệu vào một bảng tạm thời, sau đó sử dụng nhiều bảng UPDATE cú pháp tham gia bảng hiện tại của bạn vào bảng tạm thời và cập nhật các giá trị số lượng.

Ví dụ:

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

Awesome - Thats một câu trả lời thực sự phức tạp! – DocJones

+2

+1 để có câu trả lời đơn giản và dễ hiểu nhất. – diEcho

+0

@lke Walker, Bạn có thể trả lời câu hỏi này của tôi http://stackoverflow.com/questions/21495600/import-csv-to-update-rows-in-table –

5

tôi sẽ tải các cập nhật dữ liệu vào một bảng riêng biệt UPDATE_TABLE và thực hiện cập nhật trong vòng MySQL sử dụng:

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

Tôi không có một MySQL trong tầm tay ngay bây giờ, vì vậy tôi có thể kiểm tra cú pháp hoàn hảo, nó có thể bạn cần phải thêm LIMIT 0,1 vào bên trong SELECT.

Các vấn đề liên quan