MySQL 대량 INSERT 또는 UPDATE
다음과 같은 쿼리를 대량으로 수행할 수 있는 방법이 있습니까?INSERT OR UPDATE
MySQL 서버에서?
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이 사용하는 작업을 수행하는 방법에 대한 블로그 게시물입니다.MERGE
MySQL에서:
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 |