• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 1. 데이터 정의 문
    2. 데이터 조작 문
    1. CALL 구문
    2. DELETE 구문
    3. DO 구문
    4. HANDLER 구문
    5. INSERT 구문
    1. INSERT ... SELECT 구문
    2. INSERT DELAYED 구문
    3. INSERT ... ON DUPLICATE KEY UPDATE 구문
    6. LOAD DATA INFILE 구문
    7. LOAD XML 구문
    8. REPLACE 구문
    9. SELECT 구문
    10. 서브 쿼리 구문
    11. UPDATE 구문
    3. MySQL 트랜잭션과 잠금 문
    4. 복제 문
    5. Prepared Statements위한 SQL 구문
    6. MySQL 복합문 구문
    7. 데이터베이스 관리 문
    8. MySQL 유틸리티 문
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 "파티셔닝 및 잠금" 을 참조하십시오.

서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved