[Oracle] 오라클 자동 증가 컬럼 만드는 방법 (IDENTITY)

Oracle 12c부터는 별도의 시퀀스를 만들지 않아도 테이블 생성 시 자동 증가 컬럼을 정의할 수 있는 IDENTITY 컬럼 속성 기능이 추가되었다. 또한  Oracle 12c부터  테이블 생성 시 시퀀스를 컬럼의 기본값으로 직접 지정하는 추가되어서, 자동 증가 컬럼 기능을 사용하는데 훨씬 간편해졌다.

 

목차

 

IDENTITY 속성을 이용하여 자동 증가 컬럼 만들기

CREATE TABLE emp 
( 
    empno       NUMBER GENERATED ALWAYS AS IDENTITY,
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2),
    comm        NUMBER(7,2),
    deptno      NUMBER(2)
);

 

 

위의 CREATE TABLE 구문에서 직원번호(empno) 컬럼 뒤에 NUMBER GENERATED ALWAYS AS IDENTITY 속성을 지정하여 직원 테이블에 데이터가 입력되면 empno 컬럼이 순차적으로 증가하는 것을 확인할 수 있다.

 

IDENTITY는 Oracle 12c부터 추가된 자동 증가 컬럼을 정의하기 위한 문법이며, 시퀀스를 내부적으로 자동 생성하여 값을 증가시킨다. (단, IDENTITY 속성은 SEQUENCE를 생성할 수 있는 권한이 있는 사용자만 사용할 수 있음)

 

CREATE TABLE emp 
( 
    empno       NUMBER GENERATED ALWAYS AS IDENTITY
                  (START WITH 1000 INCREMENT BY 10 CACHE 20),
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2),
    comm        NUMBER(7,2),
    deptno      NUMBER(2)
);

 

 

START WITH [시작값] INCREMENT BY [증가 단위값] CACHE [캐시 개수]

 

위의 옵션을 사용하여 empno는 최초 1000부터 시작하면, 직원 데이터가 입력될 때마다 10씩 증가하여 직원번호를 생성한다. CACHE 옵션은 미리 메모리에 저장해 둘 숫자 개수 (성능 향상 목적)를 의미하여, CACHE를 사용할 경우 순차적으로 데이터가 입력되지 않을 수 있으니 순차적으로 데이터 입력을 원할 경우 CACHE [캐시 개수] → NOCACHE로 변경해서 사용하면 된다.

 

시퀀스를 컬럼 기본값으로 지정하여 자동 증가 컬럼 만들기

-- 시퀀스 생성
CREATE SEQUENCE emp_seq START WITH 1000 INCREMENT BY 20;

-- 테이블 생성
CREATE TABLE emp 
( 
    empno       NUMBER DEFAULT emp_seq.NEXTVAL PRIMARY KEY,
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2),
    comm        NUMBER(7,2),
    deptno      NUMBER(2)
);

 

 

Oracle 12c부터 테이블 생성 시 DEFAULT 값에 SEQUENCE.NEXTVAL을 지정하여 자동 증가 기능을 구현하는 방법을 할 수 있다.

 

시퀀스는 여러 테이블과 컬럼에서 공유·재사용할 수 있고, 이름·증가 단위·캐시 등 동작 방식을 자유롭게 설정하거나 ALTER로 변경할 수 있어 유연성과 관리 편의성이 뛰어나다는 장점이 있다.

 

오라클 11g 이하에서 자동 증가 컬럼 사용법

INSERT INTO emp( empno
               , ename
               , job
               , mgr
               , hiredate
               )
         VALUES( (SELECT NVL(MAX(empno), 0) + 1 FROM emp)
               , 'KING'
               , 'PRESIDENT'
               , NULL
               , '1981-11-17'
               )

 

MAX + 1 방식은 간단하고 빠르게 작성할 수 있지만, 여러 세션이 동시에 INSERT 할 때 동일한 번호가 생성될 수 있어 동시성 문제가 발생할 수 있다.

 

INSERT INTO emp( empno
               , ename
               , job
               , mgr
               , hiredate
               )
         VALUES( emp_seq.NEXTVAL
               , 'KING'
               , 'PRESIDENT'
               , NULL
               , '1981-11-17'
               )

 

시퀀스 방식은 동시 처리 환경에서도 안정적이고 중복 없이 번호를 생성할 수 있지만, 시퀀스 객체를 생성학 관리해야 하는 번거로움이 있다.

 

 

[Oracle] 오라클 INSERT 1씩 증가시키는 방법 (MAX+1, 시퀀스)

오라클에서는 칼럼의 값을 자동으로 증가시키는 기능이 없기 때문에 INSERT 작업 시 직접 일련번호를 매번 후 데이터를 입력해야 한다. 가장 많이 사용하는 방법은 일련번호 칼럼의 마지막 값을

gent.tistory.com

 

[Oracle] 오라클 시퀀스(Sequence) 생성 및 사용법 (자동증가, 일련번호)

오라클에서는 자동 증가 컬럼을 사용할 수가 없다. 다른 DB에서는 컬럼 자체에 옵션이 있으나, 오라클에서는 컬럼의 값을 증가시키기 위해서는 MAX(컬럼) + 1 또는 시퀀스를 사용하여 일련번호를

gent.tistory.com

 

 

댓글

Designed by JB FACTORY