oracle

데이터베이스 객체 _시퀀스 (생성)

꽃솜이 2021. 4. 1. 22:31

시퀀스(Sequence)는 자동 순번을 반환하는 데이터베이스 객체다.

 

예를 들어, 현재 사원 테이블의 사번(employee_id) 값은 100부터 206까지 인데 숫자형으로 되어 있다.

만약 신입사원이 들어온다면 206 다음인 207번으로 생성될 것이다.

 

그런데 207이란 숫자를 얻으려면 기존 사원번호 중 최댓값을 구해 1을 더해야 하고,

이 로직을 어딘가에 심어놔야 하는데,

 

특정한 로직을 통해 사번을 추출하는 것이 아니라

단순히 증감 연산을 이용해 유일한 숫자를 구할 때는 시퀀스를 사용하면 매우 편리하다.

 

 

CREATE SEQUENCE [스키마명.]시퀀스명
INCREMENT BY 증감숫자
START WITH 시작숫자
NOMINVALUE | MINVALUE 최솟값
NOMAXVALUE | MAXVALUE 최댓값
NOCYCLE | CYCLE
NOCACHE | CACHE;

 

  • INCREMENT BY 증감숫자: 증감숫자는 0이 아닌 정수. 양수이면 증가, 음수이면 감소. 디폴트 값은 1
  • START WITH 시작숫자: 시작숫자의 디폴트 값은 증가일 때는 MINVALUE, 감소일 경우 MAXVALUE.
  • NOMINVALUE: 디폴트 값으로 증가일 때 1, 감소의 경우 -(1027 -1).
  • MINVALUE 최솟값: 최솟값은 시작숫자와 작거나 같아야 하고 MANVALUE보다 작아야 한다.
  • NOMAXVALUE: 디폴트 값으로 증가일 때 1028-1, 감소의 경우 -1.
  • MAXVALUE 최댓값: 최댓값은 시작숫자와 같거나 커야 하고 MINVALUE보다 커야 한다.
  • NOCYCLE: 디폴트 값으로 최대나 최솟값에 도달하면 생성 중지.
  • CYCLE: 증가는 최댓값에 도달하면 다시 최솟값부터 시작, 감소는 최솟값에 도달하면 다시 최댓값에서 시작.
  • NOCACHE: 디폴트로 메모리에 시퀀스 값을 미리 할당해 놓지 않으며 디폴트 값은 20.
  • CACHE: 메모리에 시퀀스 값을 미리 할당해 놓음.

 

CREATE SEQUENCE my_seq1
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 1000
NOCYCLE
NOCACHE;


결과
    sequence MY_SEQ1이(가) 생성되었습니다.

이 시퀀스는 1부터 시작해 1씩 증가하며 최솟값 1부터 최댓값 1000까지 순번을 자동 생성한다.

그럼 이 시퀀스로 ex2_8테이블의 col1 컬럼에 값을 입력해 보자.

 

DELETE ex2_8;  -- 기존 데이터를 지운다.

INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);


결과
    1개 행 이(가) 삽입되었습니다.
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);


결과
    1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;


결과
    COL1       COL2
    ---------- ----------
    1
    2

INSERT를 두 번 실행했으므로 col1 컬럼에 1, 2 값이 순차적으로 들어 갔다. 

 

시퀀스명.NEXTVAL을 사용하면 해당 시퀀스에서 다음 순번 값을 자동으로 가져온다.

 

 

 

또한 시퀀스명.CURRVAL을 사용하면 해당 시퀀스의 현재 값을 알 수 있다.

SELECT my_seq1.CURRVAL
FROM DUAL;


결과
    CURRVAL
    ----------
            2

 

 

다시 한번 NEXTVAL로 값을 가져오면 3이 입력될 것이다.

INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);


결과
    1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;


결과
    COL1       COL2
    ---------- ----------
    1
    2
    3

 

 

주의할 사항은 NEXTVAL을 사용하면 값이 계속 증가된다는 점이다.

즉 INSERT문이 아닌 SELECT문에서 사용하더라도 값이 증가된다.

SELECT my_seq1.NEXTVAL
FROM DUAL;


결과
    NEXTVAL
    ----------
    4
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);


결과
    1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;


결과
    COL1       COL2
    ---------- ----------
    1
    2
    3
    5