복붙노트

[SQL] MySQL의 대량 INSERT 또는 UPDATE

SQL

MySQL의 대량 INSERT 또는 UPDATE

MySQL 서버에 대량으로 INSERT 또는 UPDATE 같은 쿼리를 수행하는 방법이 있습니까?

INSERT IGNORE ...

하지 작업 현장이 이미 존재하는 경우 때문에, 단순히 그것을 무시하고 아무것도 삽입하지 않습니다.

REPLACE ...

필드가 이미 존재하는 경우, 그것은 먼저 삭제 한 후 오히려 그것을 수정하지 않고, 다시 삽입하기 때문에 작동하지 않습니다.

INSERT ... ON DUPLICATE KEY UPDATE

작동하지만 대량으로 사용할 수 없습니다.

나는 (동시에 둘 이상의 행) 대량으로 발행 할 수 있습니다 INSERT ... ON DUPLICATE KEY UPDATE와 같은 모든 명령이 있는지 알고 싶습니다 그래서.

해결법

  1. ==============================

    1.당신은 / 삽입 할 수 있습니다 INSERT를 사용하여 업데이트를 여러 행 ... ON DUPLICATE KEY UPDATE. 문서는 다음 예제가 있습니다 :

    당신은 / 삽입 할 수 있습니다 INSERT를 사용하여 업데이트를 여러 행 ... ON DUPLICATE KEY UPDATE. 문서는 다음 예제가 있습니다 :

    INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
    ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
    

    아니면 내가 질문을 오해는 무엇입니까?

  2. ==============================

    2.A가에 의해 업데이트 존재를 수행 분야에 따라 존재하지 않는 레코드를 삽입 가입이 작업을 수행하는 한 가지 가능한 방법은에 데이터를 삽입, 임시 테이블을 만든 다음 1 개 쿼리를 수행하는 것입니다. 기본 사항은 다음과 같이 될 것이다.

    A가에 의해 업데이트 존재를 수행 분야에 따라 존재하지 않는 레코드를 삽입 가입이 작업을 수행하는 한 가지 가능한 방법은에 데이터를 삽입, 임시 테이블을 만든 다음 1 개 쿼리를 수행하는 것입니다. 기본 사항은 다음과 같이 될 것이다.

    CREATE TABLE MyTable_Temp LIKE MyTable
    
    LOAD DATA INFILE..... INTO MyTable_Temp
    
    UPDATE MyTable INNER JOIN 
    MyTable_Temp
    ON MyTable.ID=MyTable_Temp.ID
    SET MyTable.Col1=MyTable_Temp.Col1, MyTable.Col2=MyTable_Temp.Col2.....
    
    INSERT INTO MyTable(ID,Col1,Col2,...)
    SELECT ID,Col1,Col2,... 
    FROM MyTable_Temp
    LEFT JOIN MyTable 
    ON MyTable_Temp.ID = MyTable.ID
    WHERE myTable.ID IS NULL
    
    DROP TABLE MyTable_Temp
    

    구문은 정확하지 않을 수 있지만, 이것은 당신에게 기초를 제공해야합니다. 또한, 나는 꽤하지 알고 있지만, 일을 가져옵니다.

    최신 정보

    업데이트가 호출 될 때 모든 삽입 된 행을 업데이트하는 첫번째 원인 삽입하기 때문에, 삽입 및 업데이트의 순서를 교환. 당신이 첫 번째 업데이트를 할 경우에만 기존 레코드가 업데이트됩니다. 결과는 동일해야하지만, 이것은 서버에 대한 좀 덜 작업을 의미한다.

  3. ==============================

    3.이 질문에 이미 정답되어 있지만 (MySQL이 예상되는 다중 값 설정 구문 ON 중복 업데이트를 통해이 기능을 지원한다는 것을) 나는 MySQL을 가진 사람을 실행할 수있는 데모를 제공하여이를 확장하고 싶습니다 :

    이 질문에 이미 정답되어 있지만 (MySQL이 예상되는 다중 값 설정 구문 ON 중복 업데이트를 통해이 기능을 지원한다는 것을) 나는 MySQL을 가진 사람을 실행할 수있는 데모를 제공하여이를 확장하고 싶습니다 :

    CREATE SCHEMA IF NOT EXISTS `test`;
    DROP TABLE IF EXISTS test.new_table;
    CREATE TABLE test.new_table (`Key` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`Key`)) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8;
    
    SELECT * FROM test.new_table;
    INSERT INTO test.new_table VALUES (1),(2),(3),(4),(5) ON DUPLICATE KEY UPDATE `Key`=`Key`+100;
    SELECT * FROM test.new_table;
    INSERT INTO test.new_table VALUES (1),(2),(3),(4),(5) ON DUPLICATE KEY UPDATE `Key`=`Key`+100;
    SELECT * FROM test.new_table;
    

    출력은 다음이다 :

    Empty set (0.00 sec)
    
    Query OK, 5 rows affected (0.00 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    +-----+
    | Key |
    +-----+
    |   1 |
    |   2 |
    |   3 |
    |   4 |
    |   5 |
    +-----+
    5 rows in set (0.00 sec)
    
    Query OK, 10 rows affected (0.00 sec)
    Records: 5  Duplicates: 5  Warnings: 0
    
    +-----+
    | Key |
    +-----+
    | 101 |
    | 102 |
    | 103 |
    | 104 |
    | 105 |
    +-----+
    5 rows in set (0.00 sec)
    
  4. ==============================

    4.사전 비행 점검을 수행하고 (기존 행을 업데이트 한 후) 중복 키 삽입을 취소 삽입 트리거를 추가하십시오.

    사전 비행 점검을 수행하고 (기존 행을 업데이트 한 후) 중복 키 삽입을 취소 삽입 트리거를 추가하십시오.

    확실하지가 대량 삽입을위한 확장 성 부하 데이터 INFILE에 대한 혼자 일을 할 수 있지만, 내가 생각할 수있는 최선의 것입니다. :-)

  5. ==============================

    5.오라클 또는 Microsoft SQL을 사용하고 있었던 경우, 병합을 사용할 수 있습니다. 그러나 MySQL은 그 진술에 직접적인 상관 관계가 없습니다. 당신이 지적했듯이, 그것은 아주 잘 대량하지 않습니다, 거기에 당신이 언급하는 단일 행 솔루션입니다하지만. 여기에 내가 오라클과 MySQL과 방법 오라클이 MySQL은 MERGE로 무엇을 수행하는 방법의 차이에서 찾을 블로그 게시물입니다 :

    오라클 또는 Microsoft SQL을 사용하고 있었던 경우, 병합을 사용할 수 있습니다. 그러나 MySQL은 그 진술에 직접적인 상관 관계가 없습니다. 당신이 지적했듯이, 그것은 아주 잘 대량하지 않습니다, 거기에 당신이 언급하는 단일 행 솔루션입니다하지만. 여기에 내가 오라클과 MySQL과 방법 오라클이 MySQL은 MERGE로 무엇을 수행하는 방법의 차이에서 찾을 블로그 게시물입니다 :

    http://blog.mclaughlinsoftware.com/2009/05/25/mysql-merge-gone-awry/

    그것은 꽤 해결책이 아니다 당신이 원하는만큼 아마 가득 솔루션으로하지 않습니다,하지만 난 그 해결책을이 최고입니다 믿습니다.

  6. from https://stackoverflow.com/questions/6286452/mysql-bulk-insert-or-update by cc-by-sa and MIT license