2013-03-07 5 views
29

방대한 양의 데이터를 MySQL에로드하려면 LOAD DATA INFILE이 가장 빠른 옵션입니다. 불행히도 INSERT IGNORE 또는 REPLACE가 작동하는 방식으로 사용할 수있는 반면, ON DUPLICATE KEY UPDATE는 현재 지원되지 않습니다.중복 된 키 업데이트가있는 MySQL LOAD DATA INFILE

그러나 ON DUPLICATE KEY UPDATEREPLACE 이상의 이점이 있습니다. 후자는 중복이 존재할 때 삭제 및 삽입을 수행합니다. 이로 인해 키 관리에 오버 헤드가 발생합니다. 또한 자동 증가 ID는 대체시 동일하게 유지되지 않습니다.

LOAD DATA INFILE을 사용할 때 ON DUPLICATE KEY UPDATE을 어떻게 에뮬레이트 할 수 있습니까?

1) 새로운 임시 테이블을 만듭니다

답변

60

이 단계는이 기능을 에뮬레이트 할 수 있습니다.

CREATE TEMPORARY TABLE temporary_table LIKE target_table; 

2) 선택적으로, 일을 속도를 임시 테이블에서 모든 인덱스를 놓습니다.

SHOW INDEX FROM temporary_table; 
DROP INDEX `PRIMARY` ON temporary_table; 
DROP INDEX `some_other_index` ON temporary_table; 

3 ) 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에 사용하는 데이터를 복사)을 임시 테이블

LOAD DATA INFILE 'your_file.csv' 
INTO TABLE temporary_table 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
(field1, field2); 

4에 CSV를 부하) 임시 테이블을 제거

DROP TEMPORARY TABLE temporary_table; 

사용 SHOW INDEX FROMSHOW COLUMNS FROM이 프로세스는 주어진 테이블에 대해 자동화 될 수 있습니다.

+3

주 테이블에 *가 포함되어 기본 키가 포함되어 있고 (기본 키가 auto_increment 인 경우 기본 키가 auto_increment 인 항목이 업데이트되기 때문에) 대신에 INSERT INTO target_table SELECT coloumn_name1, coloumn_name1 FROM temporary_table을 사용하는 것이 좋습니다 , 그렇지 않으면 이것은 나를 위해 일했습니다! – JonoCoetzee

+0

답변을 주셔서 감사합니다, 약간의 SQL 저글링 후 나를 위해 일했습니다. 나의 SQL-fu는 매우 녹슬고, 이런 깔끔한 기술을 배우기에 좋다.여기 너무에서 – Chubas

+0

감사합니다 - 훌륭하게 작동은 - LOAD 데이터 INFILE와 ON 중복 키를 할 수 생각하지, 그래서 이전에 시도하지 않았다. – Shaun

1

우리는 (Jan)이 공유하는 절차에서 단일 쿼리 이하로 첫 번째 (두 단계)를 대체 할 수 있습니다.

1) 및 2) 인덱스가없는 동일한 참조 구조로 새 테이블을 만들 수 있습니다.

CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1 = 0; 새로운 임시 테이블을 작성

1) 대신

....

CREATE TEMPORARYARY TABLE temporary_table LIKE target_table;

2) 필요에 따라 임시 테이블에서 모든 색인을 삭제하여 속도를 높이십시오.

SHOW INDEX FROM temporary_table; DROP INDEX PRIMARY ON 임시 테이블; DROP INDEX some_other_index ON 임시 테이블;