개발 지식/[DBMS] Oracle

[Oracle] DDL(8) - 시퀀스(SEQUENCE)

devGSP 2022. 6. 22. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

시퀀스(SEQUENCE)

개념

데이터베이스에서 특정 규칙에 맞는 연속 숫자를 생성하는 객체. 번호를 사용해야 하는 사용자에게 계속 다음 번호를 만들어 주는 역할. 예를 들면, 우리가 주로 홈페이지를 이용하며 볼 수 있는 게시판에서 게시글을 등록할 때마다 게시판 번호를 생성할 때 사용할 수 있음.

 

SELECT MAX(COLUMN) + 1 FROM TABLE;

시퀀스 대신 위의 쿼리를 사용하는 방식은 테이블 데이터가 많아질수록 가장 큰 데이터를 찾고 새로운 번호를 계산하는 시간이 늘어난다는 단점이 있으며, 여러 곳에서 새로운 번호를 요구했을 경우에 SELECT문의 결과값이 동일하게 나와 중복되는 문제가 발생할 수 있음. 반면, 시퀀스는 지속적이고 효율적인 번호 생성이 가능함.

 

 

문법 및 세부 내용 설명

시퀀스 생성

 

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


INCREMENT BY : 시퀀스에서 생성할 번호의 증가값(기본값 : 1)(선택)
START WITH : 시퀀스에서 생성할 번호의 시작값(기본값 : 1)(선택)
MAXVALUE | NOMAXVALUE : 시퀀스에서 생성할 번호의 최댓값 지정. 최댓값은 START WITH 값 이상, MINVALUE 초괏값으로 지정. NOMAXVALUE로 지정하였을 경우 오름차순이면 10의 27승, 내림차순일 경우 -1로 설정(선택)
MINVALUE | NOMINVALUE : 시퀀스에서 생성할 번호의 최솟값 지정. 최솟값은 START WITH 값 이하, MAXVALUE 미만 값으로 지정. NOMINVALUE로 지정하였을 경우 오름차순이면 1, 내림차순일 경우 10의 -26승으로 설정(선택).
CYCLE | NOCYCLE : 시퀀스에서 생성할 번호가 MAXVALUE에 도달했을 경우 CYCLE이면 START WITH 값에서 다시 시작, NOCYCLE이면 번호 생성이 중단되고, 추가 번호 생성을 요청하면 오류 발생(선택)
CACHE | NOCACHE : 시퀀스가 생성할 번호를 메모리에 미리 할당해 놓은 수를 지정, NOCACHE는 미리 생성하지 않도록 설정. 옵션을 모두 생략하면 기본값은 20(선택)

 

위 세부 사항들을 지정하지 않을 경우 1부터 1만큼 계속 증가하는 시퀀스 생성

 

 

시퀀스 수정

 

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

 

 

시퀀스 삭제

 

DROP SEQUENCE [시퀀스명]

 

 

시퀀스 관련 의사열(pseudo column)

 

[시퀀스명].CURRVAL : 시퀀스에서 마지막으로 생성한 번호를 반환. 시퀀스를 생성하고 바로 사용하면 오류 발생. 번호가 만들어지지 않았기 때문.
[시퀀스명].NEXTVAL : 다음 번호를 생성.

 

 

사용 예시

-- 시퀀스를 테스트할 임시 테이블 생성
CREATE TABLE TB_SEQ_TEST
    AS SELECT *
         FROM DEPT
        WHERE 1 <> 1;
        
SELECT * FROM TB_SEQ_TEST;

seq_q1

 

-- 시퀀스 생성
CREATE SEQUENCE SEQ_TEMP_DEPT
  INCREMENT BY 10
  START WITH 10
  MAXVALUE 90
  MINVALUE 10
  NOCYCLE
  CACHE 2;
  
-- 생성한 시퀀스 조회
SELECT *
  FROM USER_SEQUENCES;

seq_q2

 

-- DEPTNO를 지정하지 않고 시퀀스를 이용해 INSERT 실행
INSERT INTO TB_SEQ_TEST (DEPTNO, DNAME, LOC)
     VALUES (SEQ_TEMP_DEPT.NEXTVAL, 'WEB', 'PANGYO');

SELECT * FROM TB_SEQ_TEST ORDER BY DEPTNO;

seq_q3

 

-- 현재 시퀀스 값 확인
SELECT TB_SEQ_TEST.CURRVAL
  FROM DUAL;

seq_q4

 

INSERT INTO TB_SEQ_TEST (DEPTNO, DNAME, LOC)
     VALUES (SEQ_TEMP_DEPT.NEXTVAL, 'APP', 'GANGNAM');
     
SELECT * FROM TB_SEQ_TEST ORDER BY DEPTNO;

seq_q5

 

-- 시퀀스 옵션 수정
ALTER SEQUENCE SEQ_TEMP_DEPT
  INCREMENT BY 4
  MAXVALUE 500
  CYCLE;
  
INSERT INTO TB_SEQ_TEST (DEPTNO, DNAME, LOC)
     VALUES (SEQ_TEMP_DEPT.NEXTVAL, 'PUBLISHING', 'YONGIN');
     
SELECT * FROM TB_SEQ_TEST ORDER BY DEPTNO;

seq_q6

 

10씩 증가한 시퀀스의 증가값이 4로 수정된 것을 확인할 수 있다.

 

-- 시퀀스 삭제
DROP SEQUENCE SEQ_TEMP_DEPT;

SELECT *
  FROM USER_SEQUENCES;

seq_q7

 

반응형