시퀀스(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으로 변경된 시퀀스 확인.
'오라클 기초' 카테고리의 다른 글
사용자 관리, 권한 제어: GRANT, REVOKE, 스키마, 롤 (0) | 2016.01.20 |
---|---|
인덱스(INDEX) (0) | 2016.01.19 |
가상 테이블 뷰(VIEW) (0) | 2016.01.19 |
Oracle SQL Developer에서 ERD 만들기 (1) | 2016.01.18 |
무결성 제약 조건: NotNull, Unique, PrimaryKey, ForeginKey, CASCADE (0) | 2016.01.15 |