• 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 INSERT 구문

13.2.5.1 INSERT ... SELECT 구문
13.2.5.2 INSERT DELAYED 구문
13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE 구문
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,...)] 
    [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ] 

또는 :

 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
     [INTO] tbl_name
     [PARTITION ( partition_name ...)
     SET col_name = { expr | DEFAULT}, ...
     [ON DUPLICATE KEY UPDATE
       col_name = expr
         [, col_name = expr ] ...]

또는 :

 INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
     [INTO] tbl_name
     [PARTITION ( partition_name ...) 
     [( col_name , ...)]
     SELECT ...
     [ON DUPLICATE KEY UPDATE
       col_name = expr
         [, col_name = expr ] ...]

INSERT 기존 테이블에 새로운 행을 삽입합니다. 이 문 INSERT ... VALUES 과 INSERT ... SET 형식은 명시 적으로 지정된 값에 따라 행을 삽입합니다. INSERT ... SELECT 형식은 다른 하나 이상의 테이블에서 선택된 행을 삽입합니다. INSERT ... SELECT 내용은 섹션 13.2.5.1 "INSERT ... SELECT 구문" 부분에 자세히 설명되어 있습니다.

MySQL 5.6.2 이후에서는 파티션 된 테이블에 삽입 할 때 어떤 파티션 및 하위 파티션이 새 행을 받아 들일지를 제어 할 수 있습니다. PARTITION 옵션은 테이블의 하나 이상의 파티션 또는 서브 파티션 (또는 둘 다)의 이름의 쉼표로 구분 된 목록을받습니다. 특정 INSERT 문에 의해 삽입 된 행을 나열하는 하나의 파티션과 일치하지 않으면 INSERT 문은 Found a row not matching the given partition set 오류로 실패합니다. 자세한 내용 및 예제는 섹션 19.5 "파티션 선택" 을 참조하십시오.

오래된 행을 덮어하려면 INSERT 대신에 REPLACE 를 사용할 수 있습니다. REPLACE 는 기존 행을 복제하는 고유 키 값을 갖는 새 행의 처리에서 INSERT IGNORE 에 해당하는 것입니다. 새로운 라인은 파기되는 것이 아니라 기존 행을 대체하는 데 사용됩니다. 섹션 13.2.8 "REPLACE 구문" 을 참조하십시오.

tbl_name 은 행이 삽입되는 테이블입니다. 이 문에서 값이 제공되는 컬럼은 다음과 같이 지정할 수 있습니다.

  • 테이블 이름 다음에 컬럼 이름의 쉼표로 구분 된 목록을 지정할 수 있습니다. 이 경우 지정된 각 컬럼의 값을 VALUES 목록 또는 SELECT 문에서 지정해야합니다.

  • INSERT ... VALUES 또는 INSERT ... SELECT 에 열 이름 목록을 지정하지 않으면 테이블의 모든 컬럼의 값을 VALUES 목록 또는 SELECT 문에서 지정해야합니다. 테이블 내의 컬럼의 순서를 모르는 경우 DESCRIBE tbl_name 을 사용하여 찾습니다.

  • SET 절은 컬럼 이름을 명시 적으로 보여줍니다.

컬럼 값은 다음의 몇 가지 방법으로 지정할 수 있습니다.

  • 엄격한 SQL 모드에서 실행하지 않으면 값이 명시 적으로 지정되지 않은 컬럼은 모든 기본 (명시 적 또는 암시 적) 값으로 설정됩니다. 예를 들어, 테이블의 모든 컬럼을 지정하지 않은 컬럼리스트를 지정하면, 지정된 않은 열은 기본값으로 설정됩니다. 기본값 할당 내용은 섹션 11.6 "데이터 유형 기본값" 으로 설명되어 있습니다. 섹션 1.8.3.3 "잘못된 데이터 제한" 을 참조하십시오.

    기본값이 포함되지 않은 모든 컬럼의 값을 명시 적으로 지정하지 않으면 INSERT 문에 오류가 생성되도록하려면 엄격 모드를 사용하도록하십시오. 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.

  • 컬럼을 명시 적으로 기본값으로 설정하려면 키워드 DEFAULT 를 사용합니다. 이렇게하면 테이블의 각 컬럼의 값이 포함되지 않은 불완전한 VALUES 목록을 쓰지 않아도되기 때문에 일부 컬럼을 제외한 모든 컬럼에 값을 할당 INSERT 문 작성이 쉬워집니다 . 그렇지 않은 경우는 VALUES 목록의 각 값에 대응하는 컬럼 이름의 목록을 작성해야합니다.

    또한 특정 컬럼의 디폴트 값을 생성하는 식으로 사용할 수있는보다 일반적인 형태로 DEFAULT( col_name ) 를 사용할 수 있습니다.

  • 컬럼리스트와 VALUES 목록이 모두 비어있는 경우 INSERT 는 각 컬럼을 기본 값으로 설정된 행을 만듭니다.

     INSERT INTO tbl_name () VALUES ();
    

    엄격 모드에서는 하나의 컬럼에 기본값이 포함되어 있지 않으면 오류가 발생합니다. 그렇지 않으면, MySQL은 명시 적으로 정의 된 기본값이 포함되지 않은 모든 컬럼에 대해서 암시 적 기본값을 사용합니다.

  • 수식 expr 을 지정하여 컬럼 값을 지정할 수 있습니다. 여기에는 식의 형식이 컬럼의 형태에 일치하지 않는 경우 형식 변환이 이뤄질 가능성이 있고, 특정 값의 변환은 데이터 유형에 따라 다른 값이 삽입 될 수 있습니다. 예를 들어, 문자열 '1999.0e-2' 를 INT , FLOAT , DECIMAL(10,6) 또는 YEAR 컬럼에 삽입하면 각 값 1999 , 19.9921 , 19.992100 및 1999 이 삽입됩니다. INT 와 YEAR 컬럼에 저장되는 값이 1999 인 이유는 문자열에서 정수로 변환은 문자열의 첫번째 유효한 정수 또는 년으로 간주 될 수있는 부분 만 조사 할 수 있기 때문입니다. 부동 소수점 및 고정 소수점 컬럼의 경우 문자열에서 부동 소수점으로 변환에서는 전체 문자열을 유효한 부동 소수점 값으로 간주합니다.

    수식 expr 는 이전에 값 목록에 설정된 임의의 컬럼을 참조 할 수 있습니다. 예를 들어, 다음 명령문은 col2 의 값이 이전에 할당 된 col1 을 참조하고 있기 때문에 실행 가능합니다.

     INSERT INTO tbl_name (col1, col2) VALUES (15, col1 * 2);
    

    그러나 다음 문은 col1 의 값이 col1 다음에 할당 된 col2 를 참조하고 있기 때문에 정당하지 않습니다.

     INSERT INTO tbl_name (col1, col2) VALUES (col2 * 2,15);
    

    하나의 예외는 AUTO_INCREMENT 값을 포함 열 수 있습니다. AUTO_INCREMENT 값은 다른 값 할당 후 생성하여 할당의 AUTO_INCREMENT 컬럼에 대한 참조는 모두 0 을 반환합니다.

VALUES 구문을 사용하는 INSERT 문은 여러 행을 삽입 할 수 있습니다. 이렇게에는 각각 괄호 안에 쉼표로 구분 된 컬럼 값의 여러 목록을 포함합니다. 예 :

 INSERT INTO tbl_name (a, b, c) VALUES (1,2,3) (4,5,6) (7,8,9);

각 행의 값 목록은 괄호로 둘러싸여 있어야합니다. 다음 문은 목록에서 값의 수가 컬럼 이름의 수와 일치하지 않기 때문에 잘못되었습니다.

 INSERT INTO tbl_name (a, b, c) VALUES (1,2,3,4,5,6,7,8,9);

이러한 맥락에서, VALUE 는 VALUES 의 동의어입니다. 모두 값 목록의 숫자에 대해 아무것도 표시하지 않고, 값 목록이 하나의 경우에도 여러 경우에도 사용할 수 있습니다.

INSERT 관해서는 영향을받은 행의 값은 ROW_COUNT() 함수 ( 섹션 12.14 "정보 함수" 를 참조하십시오) 또는 mysql_affected_rows() C API 함수 ( 섹션 23.8.7.1 "mysql_affected_rows ()" 를 참조하십시오 )를 사용하여 얻을 수 있습니다.

INSERT ... VALUES 문을 여러 값 목록 또는 INSERT ... SELECT 와 함께 사용하는 경우이 문은 다음과 같은 형식의 정보 문자열을 반환합니다.

 Records : 100 Duplicates : 0 Warnings : 0

Records 는이 명령문이 처리 된 행 수를 나타냅니다. (이는 Duplicates 가 0 이외 인 수 있으므로 반드시 실제로 삽입 된 행 수는 없습니다.) Duplicates 은 어떤 기존의 고유 인덱스 값을 복제하는 데 삽입 할 수없는 행 수 를 나타냅니다. Warnings 는 어떤 점에서 문제가 있었다 컬럼 값을 삽입하는 시도 횟수를 나타냅니다. 경고는 다음 조건 중 하나에서 발생할 수 있습니다.

  • NOT NULL 로 선언 된 컬럼에 NULL 을 삽입. 여러 행 INSERT 문 또는 INSERT INTO ... SELECT 문의 경우,이 컬럼은 컬럼 데이터 유형의 암시 적 기본값으로 설정됩니다. 이것은 숫자 형은 0 , 문자열은 빈 문자열 ( '' ), 날짜 및 시간 형식이 "0"의 값입니다. 서버는 SELECT 의 결과 집합을 검사하여 그것이 단일 행을 반환 여부를 확인하지 않기 때문에 INSERT INTO ... SELECT 문은 여러 줄의 삽입과 같은 방법으로 처리됩니다. (단일 행 INSERT 의 경우, NULL 이 NOT NULL 컬럼에 삽입되어 경고가 발생하지 않습니다. 대신이 문이 오류와 함께 실패합니다.)

  • 수치 컬럼, 컬럼의 범위를 벗어난 값에 설정. 이 값은 범위의 가장 가까운 끝점에 클립됩니다.

  • 숫자 컬럼에 '10.34 a' 등의 값의 할당. 후속 숫자가 아닌 텍스트는 제거되고 나머지 숫자 부분이 삽입됩니다. 문자열 값에 선두의 수치 부분이 포함되지 않은 경우,이 컬럼은 0 으로 설정됩니다.

  • 문자열 컬럼 ( CHAR , VARCHAR , TEXT 또는 BLOB )에 그 컬럼의 최대 길이를 초과하는 문자열 삽입. 이 값은 컬럼의 최대 길이로 자릅니다.

  • 날짜 또는 시간 컬럼에 해당 데이터 유형으로서 부정한 값의 삽입. 이 컬럼은 그 형태에 적절한 0의 값으로 설정됩니다.

C API를 사용하는 경우, mysql_info() 함수를 호출하여 정보 문자열을 얻을 수 있습니다. 섹션 23.8.7.35 "mysql_info ()" 를 참조하십시오.

INSERT 에서 AUTO_INCREMENT 컬럼을 포함하는 테이블에 행을 삽입 한 경우, 그 컬럼에 사용 된 값은 SQL의 LAST_INSERT_ID() 함수를 사용하여 검색 할 수 있습니다. C API 내에서, mysql_insert_id() 함수를 사용합니다.

참고

이러한 두 가지 기능이 반드시 동일한 동작을 수행하지는 않습니다. AUTO_INCREMENT 컬럼에 관련한 INSERT 문 동작 내용은 섹션 12.14 "정보 함수" 및 섹션 23.8.7.37 "mysql_insert_id ()" 부분에 자세히 설명되어 있습니다.

INSERT 문은 다음 수정 지원합니다.

  • DELAYED 키워드를 사용하면 삽입되는 하나 이상의 행을 서버가 버퍼에 배치하기 위해 INSERT DELAYED 명령문을 발행하는 클라이언트는 즉시 계속할 수 있습니다. 테이블이 사용중인 경우, 서버는 해당 행을 유지합니다. 테이블이 사용되지 않는 경우 서버는 행의 삽입을 개시하는 한편, 그 테이블에 대한 새로운 읽기 요청이 있는지 여부를 정기적으로 확인합니다. 존재하는 경우 해당 테이블을 다시 사용하지 않는 때까지 지연되는 행의 큐는 중단됩니다. 섹션 13.2.5.2 "INSERT DELAYED 구문" 을 참조하십시오.

    DELAYED 는 INSERT ... SELECT 또는 INSERT ... ON DUPLICATE KEY UPDATE 는 무시됩니다.

    DELAYED 는 또한 테이블과 트리거에 액세스하는 함수를 사용하고 있는지, 또는 함수 나 트리거에서 호출 된 INSERT 에도 무시됩니다.

    참고

    MySQL 5.6.6 현재 INSERT DELAYED 는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신 INSERT ( DELAYED 를 붙이지 않는)을 사용하십시오.

  • LOW_PRIORITY 키워드를 사용하면 INSERT 의 실행은 다른 어떤 클라이언트도 테이블에서 읽은 않을 때까지 지연됩니다. 여기에는 기존의 클라이언트 읽는 동안 나 INSERT LOW_PRIORITY 문이 기다리는 동안 읽기를 시작한 다른 클라이언트가 포함됩니다. 따라서 읽기 부하가 높은 환경에서는 INSERT LOW_PRIORITY 스테이트먼트를 발행 한 클라이언트가 매우 긴 시간 (경우에 따라서는 무기한) 대기하게 될 수 있습니다. (이것은 클라이언트를 즉시 계속할 수 있도록하는 INSERT DELAYED 와 대조적입니다.) MyISAM 테이블에서 LOW_PRIORITY 를 사용하면 병렬 삽입이 무효가되기 때문에 일반적으로 그렇지 않도록하십시오. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.

    HIGH_PRIORITY 를 지정하면 서버가 --low-priority-updates 옵션으로 시작되는 경우에 그 효과가 무시됩니다. 또한 동시 삽입도 사용되지 않습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.

    LOW_PRIORITY 과 HIGH_PRIORITY 는 테이블 수준의 잠금만을 사용하는 스토리지 엔진 ( MyISAM , MEMORY , MERGE 등)에만 영향을 미칩니다.

  • IGNORE 키워드를 사용하면 INSERT 문을 실행하는 동안 발생한 오류는 무시됩니다. 예를 들어, IGNORE 를 사용하지 않을 경우 테이블의 기존 UNIQUE 인덱스 나 PRIMARY KEY 값을 복제 할 줄은 중복 키 오류가 발생하여이 문은 중단됩니다. IGNORE 를 지정하면 해당 행이 삭제되고 오류가 발생하지 않습니다. 대신 무시 된 오류가 경고를 생성 할 수 있지만 중복 키 오류를 생성하지 않습니다.

    IGNORE 는 특정 값에 일치하는 파티션을 찾을 분할 된 테이블에 삽입에서도 같은 효과가 있습니다. IGNORE 를 지정하지 않으면이 같은 INSERT 문은 에러로 중지됩니다. 그러나 INSERT IGNORE 가 사용되는 경우 일치하지 않는 값을 포함한 행 삽입 작업이 암시 적으로 실패 만 일치하는 행은 삽입됩니다. 예를 들어, 섹션 19.2.2 "LIST 파티셔닝" 를 참조하십시오.

    IGNORE 가 지정되어 있지 않으면 오류를 트리거하는 데이터 변환에 의해 문이 중지됩니다. IGNORE 를 지정하면 잘못된 값은 가장 가까운 값으로 조정되어 삽입됩니다. 경고가 생성되지만 문은 중단되지 않습니다. mysql_info() C API 함수를 사용하면 테이블에 실제로 삽입 된 행 수를 확인할 수 있습니다.

  • ON DUPLICATE KEY UPDATE 를 지정했을 때, UNIQUE 인덱스 나 PRIMARY KEY 에 중복 된 값을 발생시키는 행이 삽입 된 경우, 이전 행의 UPDATE 가 실행됩니다. 각 행의 영향을받은 행의 값은 행이 새로운 행으로 삽입 된 경우는 1 기존의 행이 갱신 된 경우 2 기존 행이 현재 값에 설정 된 경우 0입니다. mysqld에 연결할 때 CLIENT_FOUND_ROWS 플래그를 mysql_real_connect() 에 지정하면 기존 행을 현재 값으로 설정되었을 경우의 영향을받은 행의 값은 (0이 아닌) 1입니다. 섹션 13.2.5.3 "INSERT ... ON DUPLICATE KEY UPDATE 구문" 을 참조하십시오.

테이블에 삽입하려면 그 테이블에 대한 INSERT 권한이 필요합니다. ON DUPLICATE KEY UPDATE 절이 사용되어 중복 키 위해 대신 UPDATE 가 실행되는 경우,이 문은 업데이트되는 컬럼에 대한 UPDATE 권한이 필요합니다. 읽을 만 변경되지 않는 열의 경우 SELECT 권한 만 필요합니다 ( ON DUPLICATE KEY UPDATE 절에있는 col_name = expr 할당의 오른쪽에서만 참조되는 컬럼의 경우 등).

MySQL 5.6.6 이전에는 테이블 수준의 잠금을 채용 한 MyISAM 등의 스토리지 엔진을 사용하는 파티션 된 테이블에 영향을주는 INSERT 의해 그 테이블의 모든 파티션이 잠겨있었습니다. 이것은 INSERT ... PARTITION 문에도 적용되었습니다. (이것은 행 레벨 락을 채용 한 InnoDB 등의 스토리지 엔진에서 발생하지 않았고 현재도 발생하지 않습니다.) MySQL 5.6.6 이후에서는, MySQL은 파티션 잠금 가지 치기를 사용합니다. 따라서 행이 삽입되는 파티션 만 실제로 잠기도록합니다. 자세한 내용은 섹션 19.6.4 "파티셔닝 및 잠금" 을 참조하십시오.


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