source

중복 키 업데이트가 있는 MySQL 로드 데이터 파일

itover 2022. 12. 31. 16:38
반응형

중복 키 업데이트가 있는 MySQL 로드 데이터 파일

MySQL에 대량의 데이터를 로드하려면 LOAD DATA INFILE이 단연코 가장 빠른 옵션입니다.유감스럽게도 INSERT IGNORE 또는 REPLACE가 작동하는 방식으로 사용할 수 있지만 ON DUPLICE KEY UPDATE는 현재 지원되지 않습니다.

하지만,ON DUPLICATE KEY UPDATE보다 우위성이 있다REPLACE중복이 있는 경우 후자는 삭제 및 삽입을 수행합니다.이로 인해 키 관리의 오버헤드가 발생합니다.또한 자동 증분 ID는 교환 시 동일하게 유지되지 않습니다.

어떻게 할 수 있지?ON DUPLICATE KEY UPDATELOAD DATA INFILE을 사용할 때 에뮬레이트됩니까?

이 기능을 에뮬레이트 하려면 , 다음의 순서를 사용할 수 있습니다.

  1. 새 임시 테이블을 만듭니다.

    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. CSV를 임시 테이블에 로드합니다.

    LOAD DATA INFILE 'your_file.csv'
    INTO TABLE temporary_table
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    (field1, field2);
    
  4. 중복 키 업데이트 시 데이터 복사

    SHOW COLUMNS FROM target_table;
    INSERT INTO target_table
    SELECT * FROM temporary_table
    ON DUPLICATE KEY UPDATE field1 = VALUES(field1), field2 = VALUES(field2);
    
  5. 임시 테이블을 제거합니다.

    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;

대신.

  1. 새 임시 테이블을 만듭니다.

    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;
    

비 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

반응형