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
'source' 카테고리의 다른 글
| 토요일과 일요일(및 공휴일)을 비활성화하기 위해 jQuery UI Datepicker를 만들 수 있습니까? (0) | 2023.08.30 |
|---|---|
| ORACLE SQL 날짜 범위 교차점 (0) | 2023.08.30 |
| Express 미들웨어의 req.local 대 res.local 대 res.data 대 req.data 대 app.local (0) | 2023.08.30 |
| 두 배열의 값이 동일한지 확인하는 방법 (0) | 2023.08.30 |
| 2차 활동에서 1차 활동으로 데이터를 전달하는 방법은? - Android (0) | 2023.08.30 |