programing

테이블의 열을 하나만 업데이트하도록 CSV 가져오기

bestprogram 2023. 8. 10. 18:57

테이블의 열을 하나만 업데이트하도록 CSV 가져오기

다음과 같은 테이블이 있습니다.

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

이 테이블에는 약 800,000개의 항목이 있습니다.다음과 같은 각 제품의 모든 수량을 업데이트하는 새로운 CSV 파일을 받았습니다.

productA, 12
productB, 71
productC, 92

따라서 약 750,000개의 업데이트가 있습니다(50,000개의 제품은 수량에 변화가 없었습니다).

제 질문은 이 CSV를 어떻게 가져오면 다음을 기반으로 수량만 업데이트할 수 있습니까?product하지만 내버려 둬.sku,department그리고 다른 분야들만?CSV를 루프하고 각 라인에 대해 업데이트를 실행하여 PHP에서 이 작업을 수행하는 방법을 알고 있지만 비효율적인 것 같습니다.

를 사용하여 800,000 행의 데이터를 임시 테이블로 대량 로드한 다음 다중 테이블 구문을 사용하여 기존 테이블을 임시 테이블에 결합하고 수량 값을 업데이트할 수 있습니다.

예:

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;

업데이트 데이터를 별도의 테이블에 로드합니다.UPDATE_TABLE다음을 사용하여 MySQL에서 업데이트를 수행합니다.

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

나는 지금 MySQL을 가지고 있지 않기 때문에 구문을 완벽하게 확인할 수 있습니다. 아마도 당신은 추가해야 할 것입니다.LIMIT 0,1내면까지SELECT.

@ike-walker의 답변은 정확하지만 CSV 데이터가 포맷된 경우에는 어떻게 해야 하는지 다시 확인해야 합니다.예를 들어 CSV 파일에는 여러 번 큰따옴표로 묶인 문자열 필드가 있을 수 있습니다."그리고 다음으로 끝나는 줄\r\n윈도우즈에서 작업하는 경우.
기본적으로 둘러싸는 문자는 사용되지 않으며 줄 끝은\n더 많은 정보와 예제는 여기 https://mariadb.com/kb/en/importing-data-into-mariadb/ 에서 확인할 수 있습니다.

이 문제는 다음에 대한 추가 옵션을 사용하여 해결할 수 있습니다.FIELDS그리고.LINES

CREATE TEMPORARY TABLE your_temp_table LIKE your_table;

LOAD DATA INFILE '/tmp/your_file.csv'
INTO TABLE your_temp_table
FIELDS 
   TERMINATED BY ','            
   OPTIONALLY ENCLOSED BY '"'    -- new option
LINES TERMINATED BY '\r\n'       -- new option

(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;

언급URL : https://stackoverflow.com/questions/10253605/import-csv-to-update-only-one-column-in-table