13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE 구문
ON DUPLICATE KEY UPDATE
를 지정했을 때, UNIQUE
인덱스 나 PRIMARY KEY
에 중복 된 값을 발생시키는 행이 삽입 된 경우, MySQL에 의해 이전 행의 UPDATE
가 실행됩니다. 예를 들어, 컬럼 a
가 UNIQUE
로 선언되어 값 1
을 포함하는 경우 다음 두 문장은 같은 효과가 있습니다.
INSERT INTO table (a, b, c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c = c + 1; UPDATE table SET c = c + 1 WHERE a = 1;
(이러한 효과는 a
가 자동 증가 컬럼 인 InnoDB
테이블에서 동일하지 않습니다. 자동 증가 컬럼을 사용하는 경우 INSERT
문은 자동 증가 값을 늘립니다 만, UPDATE
증가시키지 않습니다.)
ON DUPLICATE KEY UPDATE
절에는 쉼표로 구분 된 여러 컬럼 할당을 포함 할 수 있습니다.
ON DUPLICATE KEY UPDATE
를 사용하면 각 행의 영향을받은 행의 값은 행이 새로운 행으로 삽입 된 경우는 1 기존의 행이 갱신 된 경우 2 기존 행이 그 현재의 값으로 설정된 경우 0입니다. mysqld에 연결할 때 CLIENT_FOUND_ROWS
플래그를 mysql_real_connect()
에 지정하면 기존 행을 현재 값으로 설정되었을 경우의 영향을받은 행의 값은 (0이 아닌) 1입니다.
컬럼 b
도 일이면 INSERT
대신 다음 UPDATE
문에 해당합니다.
UPDATE table SET c = c + 1 WHERE a = 1 OR b = 2 LIMIT 1;
a=1 OR b=2
가 여러 행에 일치하는 경우, 하나의 행만 업데이트됩니다. 일반적으로 고유 인덱스가 여러 포함 된 테이블에 대해 ON DUPLICATE KEY UPDATE
절을 사용하는 것은 피하도록하십시오.
UPDATE
절에서 VALUES(
함수를 사용하여 col_name
)INSERT ... ON DUPLICATE KEY UPDATE
문 INSERT
부분에서 컬럼 값을 참조 할 수 있습니다. 즉, ON DUPLICATE KEY UPDATE
절에있는 VALUES(
는 중복 키 충돌이 발생하지 않는 경우에 삽입되는 col_name
)col_name
값을 참조합니다. 이 함수는 여러 행을 삽입 할 때 특히 유용합니다. VALUES()
함수는 INSERT ... UPDATE
문 안에서만 의미를 가지며, 그렇지 않으면 NULL
을 반환합니다. 예 :
INSERT INTO table (a, b, c) VALUES (1,2,3) (4,5,6) ON DUPLICATE KEY UPDATE c = VALUES (a) + VALUES (b);
그 문은 다음의 두 문장과 동일합니다.
INSERT INTO table (a, b, c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c = 3; INSERT INTO table (a, b, c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c = 9;
테이블에 AUTO_INCREMENT
컬럼이 포함되어있을 때, INSERT ... ON DUPLICATE KEY UPDATE
에 행을 삽입하거나 갱신하는 경우 LAST_INSERT_ID()
함수는 AUTO_INCREMENT
값을 반환합니다.
ON DUPLICATE KEY UPDATE
를 사용하는 경우 DELAYED
옵션은 무시됩니다.
INSERT ... SELECT
문의 결과는 SELECT
에서 행의 순서에 따라, 또한이 순서를 항상 보장 할 수 없기 때문에 로깅시 INSERT ... SELECT ON DUPLICATE KEY UPDATE
문이 마스터와 슬레이브로 다른 수 있습니다. 따라서 MySQL 5.6.4 이후에서는 INSERT ... SELECT ON DUPLICATE KEY UPDATE
문에는 문 기반 복제는 안전하지 않은 플래그가 지정됩니다. 이러한 변경으로 인해 이러한 문은 명령문 기반 모드를 사용하는 경우에는 로그에 경고를 생성하고 MIXED
모드를 사용하는 경우 행 기반 형식을 사용하여 기록됩니다. 또한 MySQL 5.6.6에서 고유 키 또는 기본 키가 여러 포함되어있는 테이블에 대한 INSERT ... ON DUPLICATE KEY UPDATE
문도 안전하지로 표시됩니다. (Bug # 11765650, Bug # 58637) 섹션 17.1.2.1 "문 기반 및 열 기반 리플리케이션의 장점과 단점" 을 참조하십시오.
MySQL 5.6.6 이전에는 테이블 수준의 잠금을 채용 한 MyISAM
등의 스토리지 엔진을 사용하는 파티션 된 테이블에 대한 INSERT ... ON DUPLICATE KEY UPDATE
에 의해 그 테이블의 모든 파티션이 잠겨 습니다. (이것은 행 레벨 락을 채용 한 InnoDB
등의 스토리지 엔진을 사용하는 테이블에서는 발생하지 않았고 현재도 발생하지 않습니다.) MySQL 5.6.6 이후에서는 이러한 문은 분할 키 컬럼이 갱신 된 파티션 만 고정됩니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.