INSERT명령문

INSERT문은 행을 테이블, 별칭 또는 뷰에 삽입하거나 기본 테이블, 별칭 또는 지정된 fullselect의 뷰에 삽입합니다.

별칭에 행 삽입은 별칭이 참조하는 데이터 소스 오브젝트에 행을 삽입합니다. 뷰에 삽입도, 이 뷰에 연산 삽입에 정의된 INSTEAD OF 트리거가 없는 경우 뷰가 기본인 테이블에 행을 삽입합니다. 이러한 트리거가 정의된 경우, 해당 트리거가 대신 실행됩니다.

호출

이 명령문은 애플리케이션 프로그램에 임베드되거나 동적 SQL문을 사용하여 실행할 수 있습니다.이 명령문은 동적으로 준비할 수 있는 실행문입니다.

권한 부여

명령문의 권한 부여 ID가 보유하는 특권에는 다음 권한 중 최소 하나가 포함되어야 합니다.
  • 대상 테이블, 뷰 또는 별칭에 대한 INSERT 특권입니다.
  • 대상 테이블, 뷰 또는 별칭에 대한 CONTROL 특권
  • 대상 테이블, 뷰 또는 별칭이 포함된 스키마에 대한 INSERTIN 특권
  • 대상 테이블, 뷰 또는 별칭이 포함된 스키마에 대한 스키마 DATAACCESS 권한
  • DATAACCESS 권한
또한, INSERT문에 사용되는 fullselect에서 참조되는 각 테이블, 뷰 또는 별칭의 경우, 명령문의 권한 부여 ID가 보유하는 특권은 다음 권한 중 최소 하나는 포함해야 합니다.
  • SELECT 특권
  • CONTROL 특권
  • 테이블, 뷰 또는 별칭이 포함된 스키마에 대한 SELECTIN 특권
  • 테이블, 뷰 또는 별칭이 포함된 스키마에 대한 스키마 DATAACCESS 권한
  • DATAACCESS 권한

GROUP 특권이 정적 INSERT문에 대해 검사되지 않습니다.

삽입 연산의 대상이 별칭인 경우, 데이터 소스의 오브젝트에 대한 특권은 명령문이 데이터 소스에서 실행되지 않으면 간주되지 않습니다. 이러한 경우, 데이터 소스에 연결하도록 사용된 권한 부여 ID는 데이터 소스의 오브젝트에서 연산에 필요한 특권이 있어야 합니다. 명령문의 권한 부여 ID는 데이터 소스의 다른 권한 부여 ID로 맵핑될 수 있습니다.

구문

구문 도표 읽기시각적 구문 도표 생략
>>-INSERT INTO--+-table-name-------+---------------------------->
                +-view-name--------+   
                +-nickname---------+   
                '-(--fullselect--)-'   

>--+-----------------------+--+---------------------+----------->
   |    .-,-----------.    |  '-| include-columns |-'   
   |    V             |    |                            
   '-(----column-name-+--)-'                            

             .-,----------------------------.              
             V                              |              
>--+-VALUES----+-+-expression-+-----------+-+----------+-------->
   |           | +-NULL-------+           |            |   
   |           | '-DEFAULT----'           |            |   
   |           |    .-,--------------.    |            |   
   |           |    V                |    |            |   
   |           +-(----+-expression-+-+--)-+            |   
   |           |      +-NULL-------+      |            |   
   |           |      '-DEFAULT----'      |            |   
   |           '-row-expression-----------'            |   
   '-+-----------------------------------+--fullselect-'   
     |       .-,-----------------------. |                 
     |       V                         | |                 
     '-WITH----common-table-expression-+-'                 

>--+--------------+--------------------------------------------><
   '-WITH--+-RR-+-'   
           +-RS-+     
           +-CS-+     
           '-UR-'     

include-columns

               .-,----------------------.      
               V                        |      
|--INCLUDE--(----column-name--data-type-+--)--------------------|

설명

INTO table-name, view-name, nickname(fullselect)
삽입 연산의 오브젝트를 식별합니다. 이름이 다음 오브젝트 중 하나를 식별해야 합니다.
  • 애플리케이션 서버에 존재하는 테이블, 뷰 또는 별칭
  • remote-object-name을 사용하여 지정된 원격 서버의 테이블이나 뷰
오브젝트는 INSTEAD OF 트리거가 주제 뷰의 삽입 연산에 정의되지 않으면 카탈로그 테이블, 구체화된 쿼리 테이블, 카탈로그 테이블의 뷰 또는 읽기 전용 뷰가 될 수 없습니다. 별칭에 삽입된 행은 별칭이 참조하는 데이터 소스 오브젝트에 위치합니다.

삽입 연산의 오브젝트가 fullselect인 경우, fullselect는 CREATE VIEW문의 설명에 있는 삽입 가능한 뷰 참고 항목에 정의된대로 삽입 가능해야 합니다.

삽입 연산의 오브젝트가 별칭인 경우, DEFAULT 및 UNASSIGNED의 확장된 표시기 변수 값은 사용되면 안됩니다(SQLSTATE 22539).

이 뷰의 삽입 연산에 INSTEAD OF 트리거가 존재하지 않는 경우, 값은 다음 요소에서 파생된 뷰 컬럼에 삽입될 수 없습니다.
  • 상수, 표현식 또는 스칼라 함수
  • 뷰의 몇몇 다른 컬럼과 동일한 기본 테이블 컬럼

삽입 조작의 오브젝트가 이러한 컬럼이 있는 뷰인 경우, 컬럼 이름의 목록이 지정되어야 하며 목록은 이러한 컬럼을 식별하지 않아야 합니다.

행이 기본 테이블 중 하나의 검사 제한조건을 충족하는 경우, 행을 UNION ALL을 사용하여 정의된 뷰 또는 fullselect에 삽입할 수 있습니다. 행이 여러 테이블의 검사 제한조건을 충족하거나 테이블의 검사 제한조건을 충족하지 않는 경우 오류가 리턴됩니다(SQLSTATE 23513).

뷰의 기본 테이블에 이전 트리거가 있고 이전 트리거에 UPDATE, DELETE 또는 INSERT 조작이 있거나 이러한 조작을 포함하는 루틴을 호출하는 경우 행은 UNION ALL을 사용하여 정의된 뷰 또는 fullselect에 삽입될 수 없습니다(SQLSTATE 42987).

(column-name,...)
삽입 값이 제공되는 컬럼을 지정합니다. 각 이름은 지정된 테이블, 뷰나 별칭 또는 fullselect의 컬럼을 지정합니다. 동일한 컬럼은 여러 번 식별되면 안됩니다. 확장된 표시기 변수가 사용 가능하지 않은 경우, 삽입된 값을 액세스할 수 없는 컬럼(예: 표현식을 기반으로 하는 컬럼)은 식별되면 안됩니다.

컬럼 목록의 생략은 내재적으로 숨겨지지 않은 테이블이나 뷰의 모든 컬럼에 있는 목록 또는 왼쪽에서 오른쪽 정렬로 식별된 fullselect의 선택 목록에 있는 모든 항목의 내재된 스펙입니다. 이 목록은 명령문이 준비된 경우에 설정되므로 명령문이 준비된 후 테이블에 추가됐던 컬럼을 포함하지 않습니다.

include-columns
여러 컬럼이 fullselect의 FROM 절에 중첩된 경우 INSERT문의 중간 결과 테이블에 있는 table-name 또는 view-name의 컬럼에 따라 포함된 여러 컬럼을 지정합니다. include-columnstable-name 또는 view-name에 지정된 컬럼의 목록 끝에 추가됩니다.
INCLUDE
INSERT문의 중간 결과 테이블에 포함할 컬럼 목록을 지정합니다. 이 절은 INSERT문이 fullselect의 FROM 절에 중첩된 경우에만 지정됩니다.
column-name
INSERT문의 중간 결과 테이블의 컬럼을 지정합니다. 이름은 다른 포함 컬럼 또는 table-name 또는 view-name의 컬럼의 이름과 동일할 수 없습니다(SQLSTATE 42711).
data-type
include 컬럼의 데이터 유형을 지정합니다. 데이터 유형은 CREATE TABLE문의 지원을 받아야 합니다.
VALUES
삽입할 하나 이상의 값 행을 소개합니다.

VALUES 절에 지정된 각 행은 행 변수가 사용되지 않는 경우 내재된 또는 명시적 컬럼 목록 및 INCLUDE 절에 식별된 컬럼에 지정 가능해야 합니다. 괄호의 행 값 목록이 지정된 경우, 첫 번째 값은 목록의 첫 번째 컬럼에 삽입되고, 두 번째 값은 두 번째 컬럼에 삽입되는 식입니다. 표현식이 지정된 경우, 행 유형의 필드 수는 내재된 또는 명시적 컬럼 목록의 이름 수와 일치해야 합니다.

expression
expression표현식 주제에서 정의된 표현식이 될 수 있습니다. expression이 행 유형인 경우, 괄호로 표시하면 안됩니다. expression이 변수인 경우, 호스트 변수는 표시기 변수를 포함하거나 호스트 구조의 경우, 확장된 호스트 변수로 사용 가능한 표시기 배열을 포함합니다. 확장 표시기 변수가 사용된 경우, 다음 명령문이 참이면 기본(-5) 또는 지정되지 않은(-7) 확장 표시기 변수 값을 사용해서는 안됩니다(SQLSTATE 22539).
  • 표현식이 명시적 캐스트를 포함한 단일 호스트 변수보다 더 복잡한 경우
  • 대상 컬럼에 구조화된 유형의 데이터 유형이 있습니다.
NULL
널 값을 지정하며 널 입력 가능한 컬럼에만 지정되어야 합니다.
DEFAULT
기본값을 사용하도록 지정합니다. DEFAULT 지정의 결과는 컬럼이 다음과 같이 어떻게 정의됐느냐에 따라 달라집니다.
  • 컬럼이 표현식에 기반하여 생성된 컬럼으로 정의된 경우 컬럼 값은 해당 표현식에 따라 시스템에 의해 생성됩니다.
  • IDENTITY 절이 사용된 경우, 값은 데이터베이스 관리자에 의하여 생성됩니다.
  • ROW CHANGE TIMESTAMP 절이 사용되는 경우, 각 삽입된 행의 값은 데이터베이스 파티션 내 테이블 파티션에 고유한 시간소인으로서 데이터베이스 관리자가 생성합니다.
  • WITH DEFAULT 절이 사용된 경우, 삽입된 값은 컬럼에 대해 정의됩니다(CREATE TABLEdefault-clause 참조).
  • NOT NULL 절이 사용되고 GENERATED 절이 사용되지 않은 경우, 또는 WITH DEFAULT 절이 사용되지 않거나 DEFAULT NULL이 사용된 경우, DEFAULT 키워드는 해당 컬럼에 지정될 수 없습니다(SQLSTATE 23502).
  • 별칭에 삽입하는 경우, DEFAULT 키워드는 데이터 소스가 쿼리 언어 구문에서 DEFAULT 키워드를 지원할 때만 INSERT문에서 데이터 소스로 전달됩니다.
row-expression
컬럼 이름을 포함하지 않은 '행 표현식'에 설명된 유형의 행 표현식을 지정합니다. 행의 필드 수는 삽입 대상과 일치해야 하며 필드는 해당 컬럼에 지정 가능해야 합니다.
WITH common-table-expression
이어지는 fullselect으로 사용하기 위한 공통 테이블 표현식을 정의합니다.
fullselect
fullselect의 결과 테이블의 양식에 있는 여러 새 행을 지정합니다. 이는 하나, 여러 개가 될 수도 있고 없을 수도 있습니다. 결과 테이블이 비어 있는 경우, SQLCODE가 +100으로 설정되고 SQLSTATE가 '02000'으로 설정됩니다.

INSERT의 기본 오브젝트 및 fullselect 또는 fullselect의 서브쿼리의 기본 오브젝트가 동일한 테이블인 경우, fullselect는 행이 삽입되기 전에 완전히 평가됩니다.

결과 테이블의 컬럼 수는 컬럼 목록의 이름 수와 같아야 합니다. 첫 번째 결과 컬럼의 값이 목록의 첫 번째 컬럼에 삽입되고 두 번째 값은 두 번째 컬럼에 삽입되는 식입니다.

결과 컬럼의 값을 지정하는 표현식이 변수인 경우, 호스트 변수는 확장된 표시기 변수로 사용 가능한 표시기 변수를 포함할 수 있습니다. 확장된 표시기 변수가 사용 가능하고 표현식이 하나 이상의 호스트 변수이거나 호스트 변수가 명시적으로 캐스트되는 중인 경우, 기본값 또는 지정되지 않은 확장된 표시기 변수 값은 사용되면 안됩니다(SQLSTATE 22539). 기본값 또는 지정되지 않은 값의 효과는 fullselect의 해당 대상 컬럼에 적용됩니다.

WITH
명령문이 실행되는 격리 레벨을 지정합니다.
RR
반복 가능한 읽기(RR)
RS
읽기 안정성(RS)
CS
커서 안정성
UR
커미트되지 않은 읽기(UR)
명령문의 기본 격리 레벨은 명령문이 바인드되는 패키지의 격리 레벨입니다. WITH절은 별칭에 적용되지 않으며 명령문의 기본 격리 레벨을 항상 사용합니다.

규칙

  • 트리거: INSERT문은 트리거가 실행되도록 합니다. 트리거는 다른 명령문이 실행되게 하거나 삽입된 값에 근거한 오류 조건을 발생시킬 수 있습니다. 뷰에의 삽입 조작으로 인해 INSTEAD OF 트리거가 실행된 경우, 유효성, 참조 무결성, 제한조건이 트리거에서 수행되는 갱신에 대해 검사되며 트리거 실행을 야기한 뷰 또는 기본 테이블에 대해서는 검사되지 않습니다.
  • 기본값: 컬럼 목록에 없는 컬럼에 삽입된 값은 컬럼의 기본 값이거나 널 값입니다. 널 값을 허용하지 않고 NOT NULL WITH DEFAULT에 정의되지 않는 컬럼은 컬럼 목록에 포함되어야 합니다. 마찬가지로, 뷰에 삽입하는 경우, 뷰에 없는 기본 테이블의 컬럼에 삽입되는 값은 컬럼의 기본값 또는 널 값입니다. 그러므로 뷰에 없는 기본 테이블의 모든 컬럼에는 기본값이 있거나 널값을 허용해야 합니다. GENERATED ALWAYS 절로 정의되어 생성된 컬럼에 삽입할 수 있는 값은 DEFAULT 뿐입니다(SQLSTATE 428C9).
  • 길이: 컬럼의 삽입 값이 번호인 경우, 컬럼은 번호의 통합 파트를 나타낼 공간이 있는 숫자 컬럼이어야 합니다. 컬럼의 삽입 값이 문자열인 경우, 컬럼은 최소 문자열의 길이만큼 길이가 속성이 있는 문자열 컬럼이거나 문자열이 날짜, 시간 또는 시간소인을 나타내는 경우 날짜 및 시간 컬럼이어야 합니다.
  • 지정: 값 삽입은 특정 지정 규칙에 따라 지정됩니다.
  • 유효성: 이름 지정된 테이블 또는 이름 지정된 뷰의 기본 테이블에 하나 이상의 고유한 인덱스가 있는 경우, 테이블에 삽입된 각 행은 해당 인덱스에 의하여 적용된 제한사항을 준수해야 합니다. WITH CHECK OPTION을 포함하는 정의의 뷰가 이름 지정된 경우, 뷰에 삽입된 각 행은 뷰의 정의를 준수해야 합니다. 이 상황을 제어하는 규칙에 대한 설명은 CREATE VIEW를 참조하십시오.
  • 참조 무결성: 테이블에 정의된 각 제한조건의 경우, 외부 키의 각 널(NULL)이 아닌 삽입 값은 상위 테이블의 기본 키 값과 같아야 합니다.
  • 검사 제한조건: 삽입 값은 테이블에 정의된 검사 제한조건의 검사 조건을 만족해야 합니다. 정의된 검사 제한조건이 있는 테이블에의 INSERT에는 삽입된 각 행을 한 번 평가한 제한조건 조건이 있습니다.
  • XML 값: XML 컬럼에 삽입된 값은 XML 문서로 잘 작성되어야 합니다(SQLSTATE 2200M).
  • 보안 정책: 식별된 테이블이나 식별된 뷰의 기본 테이블이 보안 정책으로 보호되는 경우, 세션 권한 부여 ID에는 허용되는 레이블 기반 액세스 제어(LBAC) 신임 정보가 있어야 합니다.
    • 데이터 값이 명시적으로 제공된 모든 보호된 컬럼에 대한 쓰기 액세스(SQLSTATE 42512)
    • RESTRICT NOT AUTHORIZED WRITE SECURITY LABEL 옵션(SQLSTATE 23523)으로 작성된 보안 정책을 위해 DB2SECURITYLABEL 컬럼에 제공된 명시적 값에 대한 쓰기 액세스

    세션 권한 부여 ID에는 또한 DB2SECURITYLABEL 컬럼(SQLSTATE 23523)에 내재적 값이 사용된 경우 보안 정책을 위해 쓰기 액세스의 보안 레이블이 부여되어야 합니다. 이는 다음과 같은 경우에 발생합니다.

    • DB2SECURITYLABEL 컬럼의 값이 명시적으로 제공되지 않습니다.
    • DB2SECURITYLABEL 컬럼의 값은 명시적으로 제공되지만 세션 권한 부여 ID에는 해당 값에 대한 쓰기 액세스가 없고, 보안 정책은 OVERRIDE NOT AUTHORIZED WRITE SECURITY LABEL 옵션으로 작성됩니다.
  • 확장된 표시기 변수 사용: 사용 가능한 경우, -1에서 -7까지의 범위 밖에 있는 음수 표시기 변수 값은 입력하면 안됩니다(SQLSTATE 22010). 또한 사용 가능한 경우 기본값 및 지정되지 않은 확장된 표시기 변수 값은 지원되지 않는 컨텍스트에 나타나서는 안됩니다(SQLSTATE 22539).
  • 확장된 표시기 변수: INSERT문에서 지정되지 않은 값에 컬럼을 기본값으로 설정하는 효과가 있습니다.

    대상 컬럼이 GENERATED ALWAYS로 정의된 컬럼인 경우, DEFAULT 키워드 또는 기본값이나 지정되지 않은 확장된 표시기 변수 기반의 값에 지정되어야 합니다(SQLSTATE 428C9).

참고

  • INSERT문을 실행하면 SQLCA의 SQLERRD(3) 분할 영역의 세 번째 변수의 값은 삽입 조작에 전달됐던 행의 수를 표시합니다. SQL 프로시저 명령문의 컨텍스트의 경우, GET DIAGNOSTICS문의 ROW_COUNT 변수를 사용하여 값을 검색할 수 있습니다. SQLERRD(5)에 트리거된 모든 삽입, 갱신, 삭제 조작의 계수가 있습니다.
  • 적절한 잠금이 이미 존재하지 않은 경우, INSERT문을 성공적으로 실행하면 하나 이상의 배타적 잠금을 획득합니다. 잠금이 릴리스되지 않으면 삽입된 행은 다음에 의해서만 액세스될 수 있습니다.
    • 삽입을 수행한 애플리케이션 프로세스
    • 읽기 전용 커서, SELECT INTO문 또는 서브쿼리에 사용된 subselect를 통한 격리 레벨 UR을 사용하는 다른 애플리케이션 프로세스
  • 잠금에 대한 자세한 정보는 COMMIT, ROLLBACK, LOCK TABLE문의 설명을 참조하십시오.
  • 애플리케이션이 파티션된 데이터베이스에 대해 실행 중이고, 옵션 INSERT BUF로 바인드된 경우, EXECUTE IMMEDIATE를 사용하여 처리되지 않은 VALUES문이 있는 INSERT는 버퍼 지정될 수도 있습니다. 이러한 INSERT문은 애플리케이션의 로직에 있는 루프 내에서 처리 중인 것으로 가정됩니다. 명령문을 완료하기보다는 하나 이상의 버퍼에서 새 행 값의 버퍼를 시도합니다. 나중에 수행되는 테이블에 현재 행을 삽입하면 애플리케이션의 INSERT 로직과 동기화되지 않습니다. 이러한 비동기 삽입은 애플리케이션에서 INSERT를 따르는 다른 SQL문에 리턴될 INSERT와 관련하여 오류를 발생시킬 수 있습니다.

    이는 INSERT 성능을 극적으로 향상시킬 수도 있으나 오류 처리의 비동기 속성으로 인하여 깨끗한 데이터로 사용하는 것이 가장 좋습니다.

  • 행이 ID 컬럼이 있는 테이블에 삽입되는 경우, ID 컬럼에 값이 생성됩니다.
    • GENERATED ALWAYS ID 컬럼의 경우, 항상 값이 생성됩니다.
    • GENERATED BY DEFAULT 컬럼의 경우, 값이 VALUES 절 또는 subselect로 명시적으로 지정되지 않으면 값이 생성됩니다.
    첫 번째로 생성된 값은 ID 컬럼의 START WITH 스펙 값입니다.
  • 사용자 정의 구별 유형 ID 컬럼에 값이 삽입된 경우, 전체 계산이 소스 유형으로 완료되고 결과는 값이 실제로 컬럼에 지정되기 전에 구별 유형에 캐스트됩니다. (계산 전에 소스 유형으로 이전 값이 캐스트되지 않습니다.)
  • GENERATED ALWAYS ID 컬럼에 삽입하는 경우, 값은 항상 컬럼에 대해 생성되며 사용자는 삽입 시간에 값을 지정하지 않아야 합니다. GENERATED ALWAYS ID 컬럼이 INSERT 문의 컬럼 목록에 VALUES 절의 비DEFAULT 값으로 나열된 경우, 오류가 발생합니다(SQLSTATE 428C9).
    예를 들어, EMPID가 GENERATED ALWAYS인 ID 컬럼으로 정의됐다고 가정하면 다음 명령어가 오류를 발생시킵니다.
       INSERT INTO T2 (EMPID, EMPNAME, EMPADDR)
         VALUES (:hv_valid_emp_id, :hv_name, :hv_addr) 
  • GENERATED ALWAYS ROW CHANGE TIMESTAMP 컬럼에 삽입하는 경우, 값은 항상 해당 컬럼에 생성되며 사용자는 삽입 시간에 값을 지정하지 않아야 합니다(SQLSTATE 428C9). 생성된 값은 데이터베이스 파티션에 삽입된 각 행에 고유합니다.
  • GENERATED BY DEFAULT 컬럼에 삽입하는 경우, VALUES 절 내의 컬럼에, 또는 subselect의 컬럼에 실제 값을 지정할 수 있습니다. 그러나 값이 VALUES 절에 지정된 경우, 데이터베이스 관리자는 값의 확인을 수행하지 않습니다. IDENTITY 컬럼 값의 고유성을 보장하려면 ID 컬럼의 고유 인덱스를 작성합니다.
    GENERATED BY DEFAULT ID 컬럼으로 테이블에 삽입하되 컬럼 목록을 지정하지 않는 경우, VALUES 절은 DEFAULT 키워드를 지정하여 ID 컬럼에 대한 값을 나타낼 수 있습니다. 이러한 경우, ID 컬럼에 대한 값이 생성됩니다.
       INSERT INTO T2 (EMPID, EMPNAME, EMPADDR)
         VALUES (DEFAULT, :hv_name, :hv_addr)
    이 예에서 EMPID는 ID 컬럼으로 정의되므로 이 컬럼에 삽입된 값은 데이터베이스 관리자에 의하여 생성됩니다.
  • ID 컬럼에 subselect로 삽입할 때의 규칙은 VALUES 절로 삽입할 때의 규칙과 유사합니다. ID 컬럼에 대한 값은 ID 컬럼이 GENERATED BY DEFAULT로 정의되는 경우에 만 지정될 수 있습니다.
    예를 들어, T1 및 T2가 동일한 정의가 있는 테이블이라고 가정하면 둘 모두 intcol1identcol2를 포함합니다(둘 다 유형 INTEGER이며 두 번째 컬럼에 ID 속성이 있음). 다음 삽입을 고려하십시오.
       INSERT INTO T2
         SELECT *
         FROM T1
    이 예는 논리적으로 다음과 동등합니다.
       INSERT INTO T2 (intcol1,identcol2)
         SELECT intcol1, identcol2
         FROM T1
    두 경우 모두, INSERT문이 T2의 ID 컬럼에 대한 명시적 값을 제공합니다. 이 명시적 스펙에는 ID 컬럼에 대한 값이 주어질 수 있으나 T2의 ID 컬럼은 GENERATED BY DEFAULT로 정의되어야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다(SQLSTATE 428C9).
    GENERATED ALWAYS ID로 정의된 컬럼이 있는 테이블이 있는 경우, 이는 다른 모든 컬럼을 동일한 정의가 있는 테이블에서 계속 전파 가능합니다. 예를 들어, 이전에 설명한 예 테이블 T1과 T2가 제공되면 T1 및 T2의 intcol1 값이 다음 SQL로 전파될 수 있습니다.
       INSERT INTO T2 (intcol1)
         SELECT intcol1
         FROM T1
    identcol2가 컬럼 목록에 지정되지 않으므로 생성된 기본값으로 채워집니다.
  • 컬럼이 GENERATED ALWAYS ID 컬럼 또는 ROW CHANGE TIMESTAMP 컬럼으로 정의된 단일 컬럼 테이블에 행을 삽입하는 경우, VALUES 절을 DEFAULT 키워드로 지정할 수 있습니다. 이러한 경우, 애플리케이션은 테이블에 대한 값을 제공하지 않으며 데이터베이스 관리자는 ID 또는 ROW CHANGE TIMESTAMP 컬럼에 대한 값을 생성합니다.
       INSERT INTO IDTABLE
         VALUES(DEFAULT)
    컬럼에 ID 속성이 있는 동일한 단일 컬럼 테이블로 단일 INSERT문에 여러 행을 삽입한다고 가정하면 다음 INSERT문이 사용될 수 있습니다.
       INSERT INTO IDTABLE
         VALUES (DEFAULT), (DEFAULT), (DEFAULT), (DEFAULT)
  • ID 컬럼에 대한 값을 생성하면 생성된 값이 사용됩니다. 다음에 값이 필요할 경우 새 값이 생성됩니다. 이는 ID 컬럼을 포함하는 INSERT문이 실패하거나 롤백되는 경우에도 참입니다.

    예를 들어, 고유 인덱스가 ID 컬럼에 작성되었다고 가정합니다. ID 컬럼의 값을 생성하는 중에 중복 키 위반이 발견되면 오류가 발생하며(SQLSTATE 23505) ID 컬럼에 생성된 값은 사용된 것으로 간주됩니다. 이는 ID 컬럼이 GENERATED BY DEFAULT로 정의되고 시스템이 새 값을 생성하려 하나 사용자가 이전 INSERT문의 ID 컬럼에 대한 값을 명시적으로 지정한 경우 발생할 수 있습니다. 이 경우에 동일한 INSERT문을 다시 발행하면 성공하게 됩니다. ID 컬럼의 다음 값이 생성되며 다음 값은 고유하고 이 INSERT문은 성공하게 됩니다.

  • ID 컬럼의 값을 생성하는 중에 ID 컬럼의 최대값(내림차순 시퀀스의 경우에는 최소값)을 초과하는 경우 오류가 발생합니다(SQLSTATE 23522). 이러한 경우, 사용자는 새 테이블을 큰 범위가 있는 ID 컬럼으로 DROP 및 CREATE 해야 합니다(즉, 컬럼의 데이터 유형 또는 증분값을 변경하여 값의 더 큰 범위를 허용하도록 함).

    예를 들어, ID 컬럼은 SMALLINT의 데이터 유형으로 정의되며 결국 컬럼에 지정 가능한 값이 없습니다. ID 컬럼을 INTEGER로 다시 정의하려면 데이터는 언로드되어야 하며 테이블은 삭제된 후 컬럼의 새 정의로 다시 작성되어야 하고 그리고 나서 데이터를 다시 로드하게 됩니다. 테이블이 다시 정의되면 ID 컬럼에 START WITH 값을 지정하여 생성된 다음 값이 원래 시퀀스의 다음 값이 되도록 해야 합니다. 종료 값을 판별하려면 오름차순 시퀀스의 경우 ID 컬럼의 MAX를 사용하여 쿼리를 발행하고 내림차순 시퀀스의 경우 ID 컬럼의 MIN을 사용하여 쿼리를 발행한 후 데이터를 언로드하십시오.

  • 확장된 표시기 변수 및 삽입 트리거: 삽입 트리거의 활성화에 변경사항이 없으면 확장된 표시기 변수를 사용하게 됩니다. 내재된 또는 명시적 컬럼 목록의 모든 컬럼이 지정되지 않거나 기본값인 확장된 표시기 변수 기반 값에 지정된 경우, 컬럼에 해당 기본값이 있는 삽입이 시도되며 성공하면 삽입 트리거가 활성화됩니다.
  • 확장된 표시기 변수 및 지연된 오류 검사: 확장된 표시기 변수가 사용 가능하면 갱신 가능하지 않은 컬럼으로의 삽입을 인식하기 위한 명령문 준비 중 완료된 유효성 검증이 명령문 실행까지 지연됩니다. 보고되어야 하는 오류는 실행 중에만 판별될 수도 있습니다.
  • 행 시작, 행 끝 또는 트랜잭션 시작 ID 컬럼으로 테이블에 삽입: 행이 생성된 컬럼(예: 시스템 기간 시간 테이블)이 있는 테이블에 삽입되는 경우, 데이터베이스 관리자는 다음 컬럼에 대한 값을 지정합니다.
    • 행 시작 컬럼은 테이블의 행 시작 또는 트랜잭션 시작 ID 컬럼에 지정되거나, 삭제된 시스템 기간 시간 테이블의 행에 지정될 값을 필요로 하는 트랜잭션의 첫 번째 데이터 변경 명령문의 실행 중 시계 읽기를 사용하여 생성된 값에 지정됩니다. 데이터베이스 관리자는 트랜잭션 행 시작 컬럼에 생성된 값의 고유성을 확인합니다. 단일 SQL 트랜잭션에 여러 행이 삽입되는 경우, 행 시작 컬럼의 값은 모든 행의 값과 동일하며 다른 트랜잭션의 컬럼에서 생성된 값과는 고유합니다.
    • 행 끝 컬럼은 컬럼의 데이터 유형에서 최대값에 지정됩니다(9999-12-30-00.00.00.000000000000).
    • 트랜잭션 시작 ID 컬럼은 트랜잭션 또는 널(NULL) 값 당 고유한 시간소인 값에 지정됩니다. 컬럼이 널 입력 가능한 경우, 널(NULL) 값은 트랜잭션 시작 ID 컬럼에 지정됩니다. 아니면, 값은 테이블의 행 시작 또는 트랜잭션 시작 ID 컬럼에 지정되거나, 삭제된 시스템 기간 시간 테이블의 행에 지정될 값을 필요로 하는 트랜잭션의 첫 번째 데이터 변경 명령문의 실행 중 시계 읽기를 사용하여 생성됩니다. 단일 SQL 트랜잭션에 여러 행이 삽입되는 경우, 트랜잭션 시작 ID 컬럼의 값은 모든 행의 값과 동일하며 다른 트랜잭션의 컬럼에서 생성된 값과는 고유합니다.
  • 시스템 기간 시간 테이블에 삽입: 행이 시스템 기간 시간 테이블에 삽입되는 경우, 데이터베이스 관리자는 행 시작, 행 끝 또는 트랜잭션 시작 ID 컬럼이 있는 테이블로 표시된 컬럼에 값을 지정합니다. 또한 행이 삽입되면 시스템 기간 시간 테이블에 연결된 실행기록 테이블에 행이 추가되지 않습니다.
  • 애플리케이션 기간의 시간 테이블에 삽입: 행이 애플리케이션 기간의 시간 테이블에 삽입되며 다음 조건이 충족되면 오류가 리턴됩니다.
    • 애플리케이션 기간의 시간 테이블에 기본 키나 정의된 BUSINESS_TIME WITHOUT OVERLAPS 절이 있는 고유 제한조건 또는 정의된 BUSINESS_TIME WITHOUT OVERLAPS 절이 있는 고유 인덱스가 있습니다.
    • BUSINESS_TIME 기간의 시작 및 끝 컬럼에 의하여 정의된 기간은 동일한 고유 제한조건 또는 고유 인덱스의 다른 컬럼과 일치하는 다른 행의 BUSINESS_TIME 기간의 시작 및 끝 컬럼에 의하여 정의된 기간과 오버랩됩니다.
  • 컬럼 목록이 없는 INSERT에 대한 고려사항: 컬럼 목록이 없는 INSERT문은 내재적으로 숨겨진 컬럼을 포함하지 않습니다. 내재적으로 숨겨진 것으로 정의되고 널이 아닌 컬럼에는 정의된 기본값이 있어야 합니다.

  • 예 1: 새 부서를 다음 스펙과 함께 DEPARTMENT 테이블에 삽입하십시오.
    • 부서 번호(DEPTNO)는 'E31'임
    • 부서명(DEPTNAME)은 'ARCHITECTURE'임
    • 번호 '00390'이 있는 사람에 의하여 관리됨(MGRNO)
    • 부서 'E01'에 보고(ADMRDEPT)
       INSERT INTO DEPARTMENT
         VALUES ('E31', 'ARCHITECTURE', '00390', 'E01')
  • 예 2: DEPARTMENT 테이블에 예 1에서처럼 새 부서를 삽입하나 관리자는 지정하지 마십시오.
       INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT )
         VALUES ('E31', 'ARCHITECTURE', 'E01')
  • 예 3: DEPARTMENT 테이블에 예 2에서처럼 하나의 명령문을 사용하여 새 부서 두 개를 삽입하나 관리자는 지정하지 마십시오.
       INSERT INTO DEPARTMENT (DEPTNO, DEPTNAME, ADMRDEPT)
         VALUES ('B11', 'PURCHASING', 'B01'),
                ('E41', 'DATABASE ADMINISTRATION', 'E01')
  • 예 4: EMP_ACT 테이블과 동일한 컬럼으로 임시 테이블 MA_EMP_ACT를 작성하십시오. 글자 'MA'로 시작하는 프로젝트 번호(PROJNO)가 있는 EMP_ACT 테이블에서 행이 있는 MA_EMP_ACT를 로드하십시오.
       CREATE TABLE MA_EMP_ACT
                ( EMPNO CHAR(6)  NOT NULL, 
                 PROJNO CHAR(6)  NOT NULL, 
                 ACTNO SMALLINT  NOT NULL, 
                 EMPTIME DEC(5,2), 
                 EMSTDATE DATE, 
                 EMENDATE  DATE )
       INSERT INTO MA_EMP_ACT
         SELECT * FROM EMP_ACT
           WHERE SUBSTR(PROJNO, 1, 2) = 'MA'
  • 예 5: C 프로그램 명령문을 사용하여 PROJECT 테이블에 윤곽 프로젝트를 추가하십시오. 호스트 변수에서 프로젝트 번호(PROJNO), 프로젝트 이름(PROJNAME), 부서 번호(DEPTNO), 담당 직원(RESPEMP)을 획득하십시오. 현재 날짜를 프로젝트 시작 날짜(PRSTDATE)로 사용하십시오. 널(NULL) 값을 테이블의 남아있는 컬럼에 지정하십시오.
       EXEC SQL INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE)
         VALUES (:PRJNO, :PRJNM, :DPTNO, :REMP, CURRENT DATE);
  • 예 6: INSERT문을 SELECT문 내 data-change-table-reference로 지정하십시오. 값이 VALUES 절에 지정되고 삽입된 행의 컬럼 정렬에 사용된 추가 포함 컬럼을 정의하십시오.
       SELECT INORDER.ORDERNUM
         FROM NEW TABLE (INSERT INTO ORDERS(CUSTNO)INCLUDE (INSERTNUM INTEGER)
           VALUES(:CNUM1, 1), (:CNUM2, 2)) InsertedOrders
         ORDER BY INSERTNUM;
  • 예 7: C 프로그램 명령문을 사용하여 DOCUMENTS 테이블에 문서를 추가하십시오. SQL TYPE IS XML AS BLOB_FILE에 바인드하는 호스트 변수의 문서 ID(DOCID) 컬럼 및 문서 데이터(XMLDOC) 컬럼에 대한 값을 획득하십시오.
       EXEC SQL INSERT INTO DOCUMENTS
         (DOCID, XMLDOC) VALUES (:docid, :xmldoc)
  • 예 8: 다음 INSERT문의 경우, 테이블 SALARY_INFO가 세 컬럼으로 정의되고 마지막 컬럼은 ROW CHANGE TIMESTAMP 컬럼에 내재적으로 숨겨졌다고 가정합니다. 다음 명령문에서, 내재적으로 숨겨진 컬럼은 컬럼 목록에서 명시적으로 참조되며 값은 VALUES 절에서 제공됩니다.
       INSERT INTO SALARY_INFO (LEVEL, SALARY, UPDATE_TIME)
         VALUES (2, 30000, CURRENT TIMESTAMP)
    다음 INSERT문은 내재적 컬럼 목록을 사용합니다. 내재된 컬럼 목록은 내재적으로 숨겨진 컬럼을 포함하지 않으므로 VALUES 절은 다른 두 개의 컬럼에 대한 값만을 포함합니다.
       INSERT INTO SALARY_INFO VALUES (2, 30000)
    이 경우 UPDATE_TIME 컬럼이 기본값을 갖도록 정의되어야 하며 기본값은 삽입된 행에 사용되어야 합니다.