중복 키 업데이트가 있는 MySQL 로드 데이터 파일
MySQL에 대량의 데이터를 로드하려면 LOAD DATA INFILE이 단연코 가장 빠른 옵션입니다.유감스럽게도 INSERT IGNORE 또는 REPLACE가 작동하는 방식으로 사용할 수 있지만 ON DUPLICE KEY UPDATE는 현재 지원되지 않습니다.
하지만,ON DUPLICATE KEY UPDATE보다 우위성이 있다REPLACE중복이 있는 경우 후자는 삭제 및 삽입을 수행합니다.이로 인해 키 관리의 오버헤드가 발생합니다.또한 자동 증분 ID는 교환 시 동일하게 유지되지 않습니다.
어떻게 할 수 있지?ON DUPLICATE KEY UPDATELOAD DATA INFILE을 사용할 때 에뮬레이트됩니까?
이 기능을 에뮬레이트 하려면 , 다음의 순서를 사용할 수 있습니다.
새 임시 테이블을 만듭니다.
CREATE TEMPORARY TABLE temporary_table LIKE target_table;필요에 따라 모든 인덱스를 임시 테이블에서 삭제하여 작업 속도를 높입니다.
SHOW INDEX FROM temporary_table; DROP INDEX `PRIMARY` ON temporary_table; DROP INDEX `some_other_index` ON temporary_table;CSV를 임시 테이블에 로드합니다.
LOAD DATA INFILE 'your_file.csv' INTO TABLE temporary_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (field1, field2);중복 키 업데이트 시 데이터 복사
SHOW COLUMNS FROM target_table; INSERT INTO target_table SELECT * FROM temporary_table ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);임시 테이블을 제거합니다.
DROP TEMPORARY TABLE temporary_table;
사용.SHOW INDEX FROM그리고.SHOW COLUMNS FROM이 프로세스는 임의의 테이블에 대해 자동화할 수 있습니다.
Jan이 공유한 답변에서 첫 번째(2단계)를 아래의 단일 쿼리로 대체할 수 있습니다.
스텝 1과 2에서는 인덱스를 사용하지 않고 동일한 참조 구조를 가진 새 테이블을 만들 수 있습니다.
CREATE TEMPORARY TABLE temporary_table SELECT * FROM target_table WHERE 1=0;
대신.
새 임시 테이블을 만듭니다.
CREATE TEMPORARY TABLE temporary_table LIKE target_table;필요에 따라 모든 인덱스를 임시 테이블에서 삭제하여 작업 속도를 높입니다.
SHOW INDEX FROM temporary_table; DROP INDEX `PRIMARY` ON temporary_table; DROP INDEX `some_other_index` ON temporary_table;
비 LOCAL 동작과 LOCAL 동작
LOCAL 수식자는 LOCAL 이외의 조작과 비교하여 LOAD DATA의 다음 측면에 영향을 줍니다.
- 입력 파일의 예상 위치가 변경됩니다. 입력 파일 위치를 참조하십시오.
- 스테이트먼트의 보안 요건을 변경합니다.「보안 요건」을 참조해 주세요.
- 입력 파일 내용 해석 및 오류 처리에는 IGNORE 수식자와 동일한 효과가 있습니다. "복제 키 및 오류 처리" 및 "열 값 할당"을 참조하십시오.
LOCAL이 기능하는 것은 서버와 클라이언트가 모두 LOCAL을 허용하도록 설정되어 있는 경우 뿐입니다.예를 들어 mysqld가 local_infile 시스템 변수를 디세블로 하여 시작된 경우 LOCAL에서 오류가 발생합니다.섹션 6.1.6 "LOAD DATA LOCAL에 대한 보안 고려 사항"을 참조하십시오.
언급URL : https://stackoverflow.com/questions/15271202/mysql-load-data-infile-with-on-duplicate-key-update
'source' 카테고리의 다른 글
| iOS/Android 운영 체제 검색 (0) | 2022.12.31 |
|---|---|
| 오류 1396(HY000):'user'@'localhost'에 대한 DROP USER 작업이 실패했습니다. (0) | 2022.12.31 |
| 더블을 Big Decimal로 변환하고 Big Decimal Precision을 설정합니다. (0) | 2022.12.31 |
| MySQL에서 "unsigned"는 무엇을 의미하며 언제 사용해야 합니까? (0) | 2022.12.31 |
| MySQL에서 테이블을 삭제하면 인덱스도 삭제됩니까? (0) | 2022.12.31 |