source

MySQL 대량 INSERT 또는 UPDATE

lovecheck 2023. 8. 30. 21:48
반응형

MySQL 대량 INSERT 또는 UPDATE

다음과 같은 쿼리를 대량으로 수행할 수 있는 방법이 있습니까?INSERT OR UPDATEMySQL 서버에서?

INSERT IGNORE ...

필드가 이미 있는 경우 필드를 무시하고 아무것도 삽입하지 않기 때문에 작동하지 않습니다.

REPLACE ...

필드가 이미 존재하는 경우 먼저 작동하지 않습니다.DELETE그것도 그 때INSERT업데이트하는 대신 다시 시작합니다.

INSERT ... ON DUPLICATE KEY UPDATE

효과는 있겠지만, 대량으로 사용할 수는 없습니다.

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

INSERT...를 사용하여 여러 행을 삽입/업데이트할 수 있습니다.중복 키 업데이트 시.설명서의 예는 다음과 같습니다.

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

아니면 제가 당신의 질문을 오해하고 있는 건가요?

이렇게 하는 한 가지 방법은 임시 테이블을 만들고 데이터를 해당 테이블에 삽입한 다음 조인으로 쿼리 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

구문이 정확하지 않을 수 있지만 기본적인 내용을 제공합니다.또한, 저는 그것이 예쁘지 않다는 것을 알지만, 그것은 일을 완성합니다.

갱신하다

먼저 삽입하면 업데이트가 호출될 때 삽입된 모든 행이 업데이트되기 때문에 삽입 순서와 업데이트 순서를 맞바꿨습니다.먼저 업데이트하면 기존 레코드만 업데이트됩니다.결과는 동일해야 하지만 서버의 작업량이 조금 줄어들 것입니다.

이 질문은 이미 올바르게 답변되었지만(MySQL은 예상되는 다중 값 집합 구문을 사용하여 중복 업데이트를 통해 이 문제를 지원합니다), 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)

사전 비행 검사를 수행하고 중복 키에서 삽입을 취소하는 삽입 트리거를 추가합니다(기존 행을 업데이트한 후).

파일의 로드 데이터에 대한 작업은 고사하고 대량 삽입에 대한 확장성이 좋을 지 모르겠지만, 제가 생각할 수 있는 최고의 방법입니다. :-)

오라클 또는 마이크로소프트 SQL을 사용하는 경우MERGE그러나 MySQL은 해당 문과 직접적인 상관 관계가 없습니다.말씀하신 단일 행 솔루션이 있지만, 지적하신 대로 대량 생산이 잘 되지 않습니다.다음은 Oracle과 MySQL의 차이점과 Oracle이 사용하는 작업을 수행하는 방법에 대한 블로그 게시물입니다.MERGEMySQL에서:

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

그것은 좋은 해결책도 아니고 아마도 당신이 원하는 만큼 완전한 해결책도 아닐 것입니다. 하지만 저는 그것이 해결책을 위한 최선의 방법이라고 믿습니다.

언급URL : https://stackoverflow.com/questions/6286452/mysql-bulk-insert-or-update

반응형