INSERT IN TO… SELECT from… ON DUPLICATE KEY UPDATE


116

고유 키가 이미있는 경우 대부분의 열을 새 값으로 업데이트해야하는 삽입 쿼리를 수행하고 있습니다. 다음과 같이 진행됩니다.

INSERT INTO lee(exp_id, created_by, 
                location, animal, 
                starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...; 
//update all fields to values from SELECT, 
//       except for exp_id, created_by, location, animal, 
//       starttime, endtime

UPDATE절의 구문이 무엇인지 잘 모르겠습니다 . SELECT절 에서 현재 행을 어떻게 참조 합니까?

답변:


172

MySQL은 같음 앞의 부분이 INSERT INTO 절에 명명 된 열을 참조하고 두 번째 부분이 SELECT 열을 참조한다고 가정합니다.

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, 
       t.inact, t.inadur, t.inadist, 
       t.smlct, t.smldur, t.smldist, 
       t.larct, t.lardur, t.lardist, 
       t.emptyct, t.emptydur 
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...

6
@dnagirl : 팁 : PK 열을 업데이트하려고하지 마십시오. 업데이트가 필요한
열만

45
제안 된 구문이 작동하며이 ( t.가) 필요합니다. 또한 이 구문을 사용 하는 xaprb ( xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql ) 에 대한 기사를 찾았습니다 on duplicate key update b = values(b), c = values(c).. 이것도 작동합니다.
dnagirl

9
참고 : SELECT 문에 GROUP BY 절이있는 경우에는 작동하지 않습니다
joHN

11
@john SELECT 문에 GROUP BY 절이있는 경우 수행 할 작업
Kathir

2
dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html 은`MySQL 5.6.4 이상에서 INSERT ... SELECT ON DUPLICATE KEY UPDATE 문이 문 기반 복제에 안전하지 않은 것으로 플래그 지정됩니다. ... 또한 MySQL 5.6.6부터는 하나 이상의 고유 키 또는 기본 키가있는 테이블에 대한 INSERT ... ON DUPLICATE KEY UPDATE 문도 안전하지 않은 것으로 표시됩니다 .`
Abdul Muneer

51

나는 이것에 매우 늦었지만 INSERT-SELECTquery with GROUP BYclause 를 사용하려는 사람들에게 합법적 인 질문을 본 후 이에 대한 해결 방법을 찾았습니다.

더의 대답 촬영 마커스 아담스 와 회계 GROUP BY그것에서, 이것은 내가 사용하여 문제를 해결할 방법입니다Subqueries in the FROM Clause

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, 
                inact, inadur, inadist, 
                smlct, smldur, smldist, 
                larct, lardur, lardist, 
                emptyct, emptydur)
SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, 
       sb.inact, sb.inadur, sb.inadist, 
       sb.smlct, sb.smldur, sb.smldist, 
       sb.larct, sb.lardur, sb.lardist, 
       sb.emptyct, sb.emptydur
FROM
(SELECT id, uid, location, animal, starttime, endtime, entct, 
       inact, inadur, inadist, 
       smlct, smldur, smldist, 
       larct, lardur, lardist, 
       emptyct, emptydur 
FROM tmp WHERE uid=x
GROUP BY location) as sb
ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...

8
COUNT, GROUP 등의 쿼리에 대한 정답입니다. 감사합니다.
Kostanos 2015-06-26

정말 고마워 친구! 저는이 접근 방식을 정말 좋아했는데, 특히 InfluxDB가하는 일인 Continuous Query와 같은 메커니즘을 만들 수 있기 때문입니다.
Miere

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.