본문 바로가기
Database/Oracle

[Oracle SQL] 시퀀스(SEQUENCE)

by Amy IT 2022. 5. 15.

시퀀스는 호출될 때마다 자동으로 유일한 숫자를 생성하는 오라클 객체입니다. 예를 들어 게시판의 글 번호가 순차적으로 넘버링될 수 있도록 시퀀스를 사용합니다.

 

 

1. 시퀀스 생성

 

시퀀스를 생성하는 기본 문법입니다.

CREATE SEQUENCE 시퀀스명
[START WITH n]
[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE]

 

START WITH n 은 시작값을 지정할 때 사용하며, 생략시 1부터 시작합니다.

INCREMENT BY n 은 증가값을 지정할 때 사용하며, 생략시 1부터 시작합니다.

MAXVALUE n 은 최대값을 지정할 때 사용하며, 생략시 오라클이 자동으로 매우 큰 숫자로 설정합니다.

MINVALUE n 은 최소값을 지정하며 CYCLE인 경우에는 반복 후 새로 시작하는 값 역할을 합니다.

CYCLE 옵션은 최대값까지 증가가 완료된 후 다시 시작할 것인지 끝낼 것인지를 결정합니다.

CACHE 옵션은 메모리상의 시퀀스값을 미리 만들어서 필요시 바로 제공하는 방법입니다. 

 

부서 번호를 자동으로 부여해 주는 시퀀스 객체를 생성해 보겠습니다.

CREATE SEQUENCE dept_deptno_seq
  START WITH 10
  INCREMENT BY 10
  MAXVALUE 100
  MINVALUE 5
  CYCLE
  NOCACHE;

 

시퀀스가 생성되고 나면, NEXTVAL를 먼저 호출한 후 CURRVAL로 현재 시퀀스 값을 얻어올 수 있습니다. NEXTVAL을 호출할 때마다 10씩 증가하고 최대값인 100에 도달한 후에는 최소값인 5부터 다시 시퀀스가 시작됩니다. 

SELECT dept_deptno_seq.NEXTVAL, dept_deptno_seq.CURRVAL
FROM DUAL;

 

증가값은 음수로 지정할 수도 있습니다. 다음과 같이 음수 지정 시 시작값 100에서 10씩 감소하다가, 최소값인 10에 도달하면 최대값인 150부터 다시 시퀀스를 시작하게 됩니다. 

CREATE SEQUENCE dept_deptno_seq2
  START WITH 100
  INCREMENT BY -10
  MAXVALUE 150
  MINVALUE 10
  CYCLE
  NOCACHE;

 

이를 이용해 사원 번호를 자동 생성하는 시퀀스를 만들어 보겠습니다. 

CREATE SEQUENCE emp_seq
  START WITH 100
  INCREMENT BY 1
  MAXVALUE 9999
  NOCYCLE
  NOCACHE;

 

이 시퀀스를 통해 사원 번호를 자동 생성하여 emp 테이블에 사원 3명을 입력해 보겠습니다.

INSERT INTO emp (empno, ename)
VALUES (emp_seq.NEXTVAL, '김봄');
INSERT INTO emp (empno, ename)
VALUES (emp_seq.NEXTVAL, '이여름');
INSERT INTO emp (empno, ename)
VALUES (emp_seq.NEXTVAL, '박가을');

사원들의 사원 번호가 시작값인 100부터 순차적으로 자동 넘버링된 것을 볼 수 있습니다.

 

 

 

2. 시퀀스 수정

 

ALTER SEQUENCE 문을 사용하여 시퀀스를 수정할 수 있습니다. 시퀀스가 변경되면 다음 시퀀스 값부터 반영이 되며, START WITH 값은 변경 불가능합니다. 

 

옵션 없이 시퀀스를 생성해 보겠습니다.

CREATE SEQUENCE dept_deptno_seq3;

 

데이터 사전에서 시퀀스를 확인할 수 있습니다.

SELECT *
FROM user_sequences
WHERE sequence_name='DEPT_DEPTNO_SEQ3';

 

기본값으로 설정된 시퀀스를 증가값 10, 사이클 옵션으로 수정해 보겠습니다.

ALTER SEQUENCE dept_deptno_seq3
  INCREMENT BY 10
  CYCLE;

 

데이터 사전에서 변경된 사항을 확인할 수 있습니다.

 

 

 

3. 시퀀스 삭제

 

DROP을 사용하여 시퀀스를 삭제할 수 있습니다. 

DROP SEQUENCE emp_seq;

 

 

이상은 시퀀스 객체에 대한 내용이었습니다. 

 

 

 

댓글