이 게시물은 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;
-- 시퀀스 생성
CREATE SEQUENCE SEQ_TEMP_DEPT
INCREMENT BY 10
START WITH 10
MAXVALUE 90
MINVALUE 10
NOCYCLE
CACHE 2;
-- 생성한 시퀀스 조회
SELECT *
FROM USER_SEQUENCES;
-- 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;
-- 현재 시퀀스 값 확인
SELECT TB_SEQ_TEST.CURRVAL
FROM DUAL;
INSERT INTO TB_SEQ_TEST (DEPTNO, DNAME, LOC)
VALUES (SEQ_TEMP_DEPT.NEXTVAL, 'APP', 'GANGNAM');
SELECT * FROM TB_SEQ_TEST ORDER BY DEPTNO;
-- 시퀀스 옵션 수정
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;
10씩 증가한 시퀀스의 증가값이 4로 수정된 것을 확인할 수 있다.
-- 시퀀스 삭제
DROP SEQUENCE SEQ_TEMP_DEPT;
SELECT *
FROM USER_SEQUENCES;
'개발 지식 > [DBMS] Oracle' 카테고리의 다른 글
[Oracle] 제약 조건(2) - UNIQUE (0) | 2022.06.24 |
---|---|
[Oracle] 제약 조건(1) - 제약 조건(CONSTRAINT) 제어, NOT NULL (0) | 2022.06.23 |
[Oracle] DDL(7) - 시노님(SYNONYM) (0) | 2022.06.21 |
[Oracle] DDL(6) - 뷰(VIEW) (0) | 2022.06.20 |
[Oracle] DDL(5) - 인덱스(INDEX) (0) | 2022.06.19 |