시퀀스(SEQUENCE): 자동 번호 발생기
시퀀스(SEQUENCE)
숫자를 자동으로 생성하는 자동번호 발생기. 오라클에서 행을 구분하는 기본 키가 항상 유일한 값을 갖도록 테이블 내의 유일한 숫자를 자동으로 생성해주는 것이 시퀀스로, 시퀀스를 기본 키로 사용하면 사용자의 부담을 줄일 수 있다.
게시판에 글쓸 때 게시판 새 글번호, 사원 데이터를 추가할 때 새 사번 등.
시퀀스를 쓰지 않는 경우에는
SELECT MAX(EMPNO)+1 FROM EMP -- 새 사원번호는 기존 사원번호+1
1. 시퀀스의 형식
CREATE SEQUENCE sequence_name
[START WITH n]
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
1) START WITH n : 시퀀스 번호의 시작값 지정
2) INCREMENT BY n : 연속적 시퀀스 번호의 증가치
3) MAXVALUE n | NOMAXVALUE : 시퀀스 최대값을 지정
NOMAXVALUE: 오름차순 ASC일 때 1027승, 내림차순 DESC일 때 -1
4) MINVALUE n | NOMINVALUE : 시퀀스 최소값을 지정.
NOMAXVALUE: 오름차순 ASC일 때 1, 내림차순 DESC일 때 1026승
5) CYCLE | NOCYCLE : 시퀀스가 최대값까지 완료하면 시작값에서 다시 시퀀스 시작
NOCYCLE은 증가가 완료 되면 에러 발생
6) CACHE n | NOCACHE : 메모리상의 시퀀스값 관리(기본값은 20)
NOCACHE는 원칙적으로 메모리상에서 시퀀스를 관리하지 않는다.
예제) 부서번호를 자동으로 부여해주는 시퀀스 객체를 생성
CREATE SEQUENCE DEPTNO_SEQ
INCREMENT BY 10
START WITH 1;
-- 시작값이 1이고 10씩 증가하는 시퀀스 EMP_SEQ를 생성한다.
2. 시퀀스 관련 데이터 딕셔너리
DESC USER_SEQUENCES
-- 데이터 딕셔너리 USER_SEQUENCES의 테이블 구조 살펴보기
이름 널 유형
------------- -------- ------------
SEQUENCE_NAME NOT NULL VARCHAR2(30)
MIN_VALUE NUMBER
MAX_VALUE NUMBER
INCREMENT_BY NOT NULL NUMBER
CYCLE_FLAG VARCHAR2(1)
ORDER_FLAG VARCHAR2(1)
CACHE_SIZE NOT NULL NUMBER
LAST_NUMBER NOT NULL NUMBER
CREATE SEQUENCE EMP_COPY_SEQ;
-- 시퀀스를 생성
SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
3. 시퀀스 값을 알아보는 CURRVAL과 NEXTVAL
CURRVAL : 현재 시퀀스 값
NEXTVAL : 다음 시퀀스 값
1) NEXTVAL, CURRVAL을 사용할 수 있는 경우
- 서브쿼리가 아닌 SELECT문
- INSERT문의 SELECT절
- INSERT문의 VALUE절
- UPDATE문의 SET절
2) NEXTVAL, CURRVAL을 사용할 수 없는 경우
- VIEW의 SELECT절
- DISTINCT 키워드가 있는 SELECT문
- GROUP BY, HAVING, ORDER BY절이 있는 SELECT문
- SELECT, DELETE, UPDATE의 서브쿼리
- CREATE TABLE, ALTER TABLE 명령의 DEFAULT 값
SELECT EMP_COPY_SEQ.NEXTVAL FROM DUAL;
SELECT EMP_COPY_SEQ.NEXTVAL FROM DUAL; -- 실행할 때마다 값이 증가한다.
1번 실행했을 때엔 1, 2번 실행하면 2...실행 때마다 시퀀스 값이 계속 증가하는 것을 확인할 수 있다.
SELECT EMP_COPY_SEQ.CURRVAL FROM DUAL;
현재 시퀀스 값을 확인한다.
4. 시퀀스 실무에 적용하기
SELECT * FROM EMP_COPY;
INSERT INTO EMP_COPY VALUES(
-- EMPNO를 시퀀스로 자동생성. 맨 아래에 추가된다.
5. 시퀀스 삭제 DROP SEQUENCE
SELECT SEQUENCE_NAME, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
DROP SEQUENCE EMP_COPY_SEQ;
Sequence EMP_COPY_SEQ이(가) 삭제되었습니다.
6. 시퀀스 수정 ALTER SEQUENCE
CREATE SEQUENCE DEPT_DEPTNO_SEQ
START WITH 10
INCREMENT BY 10
MAXVALUE 30;
-- 시퀀스 최대값이 30인 시퀀스 생성
SELECT SEQUENCE_NAME, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
-- 생성된 최대값 30의 시퀀스 확인.
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
-- 부서번호를 계속 생성한다. 10, 20, 30으로 증가하다가 4번째에서 오류가 발생한다.
(CYCLE 옵션을 지정하지 않았으므로 기본 NOCYCLE이므로 오류가 발생한다.)
ALTER SEQUENCE DEPT_DEPTNO_SEQ
MAXVALUE 1000;
-- 시퀀스 최대값을 1000으로 수정
SELECT SEQUENCE_NAME, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
-- 최대값이 1000으로 변경된 시퀀스 확인.