2012-09-08 2 views
4

나는 현재 내 데이터베이스에 csv 파일을 삽입 할 MySQL의 LOAD 데이터 INFILE을 사용하고 있습니다. 이 CSV 파일은 제품 데이터를 최신 상태로 유지하기 위해 매일 서버에 다운로드됩니다. 내가 알고 싶은 무엇MySQL의 LOAD 데이터 INFILE 업데이트

내가 새로운 CSV로 테이블을 업데이트하고 다른 아니라 기존 데이터를 보존 할 수있는 방법인가?

여기에 내 현재 성명 :

LOAD DATA LOCAL INFILE '$file' REPLACE INTO TABLE products FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\' IGNORE 1 LINES (aw_product_id,merchant_id,merchant_image_url,aw_deep_link,description,in_stock,merchant_name,brand_name,display_price,product_name,rrp_price,merchant_category 

이 잘 작동하지만 완전히 새로운 세트와 함께 ID 열을 대체하고 또한 내가 다시 기본 상태로, 무시하려는 열을 되돌립니다. 나는 어떻게 일부 열을 교체하지만 무시 사용할 수는 다시 0

에 해당 열을 설정 REPLACE 사용하는 경우 예를 들어 I는 0 또는 1의 값을 '게시'라는 열이?

답변

5

나는 약간의 열을 교체하지만 무시 사용할 수있는 방법 에 대한 답변?당신이 할 수없는 : REPLACE가에 allways 완전한 행, 해당 행이 아닌 하나의 필드 값을 대체합니다.

에 대한 대답은 내가 여전히 내 목표를 달성 할 수하지만 입니다 예 : 나의 추천은 (REPLACE 반대) INSERTUPDATE에 저장 프로 시저 또는 쿼리를 사용하여 다른 테이블에 LOAD DATA LOCAL INFILE에 주요 것 표. 조금 더 많은 정보 (테이블 구조,로드 된 데이터와 기존 데이터가 일치하는 열)를 제공하면 더 많은 정보를 얻을 수 있습니다.

+0

내 의심을 확인해 주셔서 감사합니다. – veeTrain

1

보강 경우/테이블 변경하십시오 tmp_table에

먼저 LOAD DATA합니다. 그 IODKUs을 "청크"생각이 테이블이 매우 큰 경우

INSERT INTO real_table 
    SELECT ... FROM tmp_table 
    ON DUPLICATE KEY UPDATE 
     a = VALUES(a), ... 

: 그런 다음에 이것을 사용하려면 새 행을 만들거나 기존 행을 업데이트합니다. 청크 팁은 my blog을 참조하십시오.

참고 : IODKU는 UPDATE으로하는 열을 제어하는 ​​UNIQUE (아마도 PRIMARY) KEY 필요하다.

전체를 교체 할 경우, 다음이 훨씬 낫다 :

CREATE TABLE new LIKE real; 
LOAD DATA ... INTO new; 
RENAME TABLE real TO old, new TO real; -- atomic and fast (no downtime) 
DROP TABLE old; 

REPLACE를 사용하지 마십시오 교체; 에 INSERT을 더한 것입니다. AUTO_INCREMENT이 있으면 해당 ID가 버려지고 ("구워짐"), 몇 달 후에 ID가 부족할 수 있습니다.

+0

안녕하세요, 친구, 난 7 열, 기본 키가 나를 위해 대단히이 쿼리에 대한 열 및 값을 기반으로하기 때문에, 나는 삽입하거나 csv 파일에서 하나의 열을 업데이 트하려는 테이블을 가지고있다; 문제는 중복이 올바르게 사용되지 않는다는 것입니다. 가능한 경우이 시나리오에서 행 A, B, C 중 3 개가 해당 값과 일치하면 (이미 레코드가 있음) 업데이트를 수행하십시오. 일치하는 것이 없으면 큐에 삽입하십시오. –