[Oracle] 29.시퀀스
시퀀스
employee_id와 같이 테이블의 기본키는 보통 중복되지 않은 숫자입니다!
그런데 데이터 양이 많을 때 중복되지 않는 번호를 찾아서 생성하기가 쉽지 않습니다!
Oracle에선 다행히 자동으로 숫자를 생성해주는 시퀀스가 존재합니다!
시퀀스는 다음과 같이 생성합니다!
CREATE SEQUENCE EMP_SEQ
INCREMENT BY 1 -- 얼마씩 증가할지
START WITH 1; -- 시작 번호
만들어진 시퀀스는 데이터 딕셔너리에 저장됩니다!
SELECT
*
FROM
user_sequences;
시퀀스를 생성하고 번호를 발생시키려면 시퀀스명.NEXTVAL 하면 됩니다!
SELECT
emp_seq.NEXTVAL
FROM
dual;
시퀀스명.nextval 이 호출될 때 마다 시퀀스 값은 증가해서 생성됩니다!
시퀀스의 현재 값을 보려면 시퀀스명.CURRVAL 하면 됩니다.
SELECT
emp_seq.NEXTVAL,
emp_seq.CURRVAL
FROM
dual; --현재 squence 값 조회
조심할 것은 시퀀스명.NEXTVAL을 포함한 코드가 컴파일 에러가 발생해도 시퀀스의 값은 증가합니다~!
또, 시퀀스 값은 테이블에 독립적입니다!
즉, 하나의 시퀀스를 여러 테이블이 공용해서 사용가능합니다!
그리고 시퀀스 값을 초기화하려면 시퀀스를 제거하고 다시 생성할 수 밖에 없습니다!
롤백한다고 해서 이전 값으로 돌아가지 않습니다~
시퀀스를 제거할 때는 DROP문을 이용합니다!
DROP SEQUENCE emp_seq;
NEXTVAL, CURRVAL을 사용할 수 있는 경우
시퀀스의 값을 사용할 수 있는 경우는 다음과 같습니다.
- 서브쿼리가 아닌 SELECT문
- INSERT문의 SELECT문, VALUES 절
- UPDATE의 SET 절
다음은 사용하지 못하는 경우입니다!
- VIEW의 SELECT문
- DISTINCT가 있는 SELECT 문
- GROUP BY, HAVING, ORDER BY 절이 있는 SELECT문
- 서브쿼리
- CREATE TABLE, ALTER TABLE 등
어차피 시퀀스는 99.9% INSERT 연산과 같이 사용되기에 INSERT 문에만 잘 사용하시면 됩니다!
MAXVALUES n, MINVALUES n
시퀀스를 생성할 때도 다양한 옵션이 있는데요~
MAXVALUES와 MINVALUES는 시퀀스의 최대값과 최소값을 정해줍니다!
한 번 예제를 통해 살펴보죠!
다음과 같이 DEPT01 테이블을 정의하겠습니다.
CREATE TABLE dept01 (
deptno NUMBER,
deptname VARCHAR2(30)
);
그리고 시퀀스를 생성하겠습니다!
CREATE SEQUENCE dept_seq
INCREMENT BY 10
START WITH 10
MAXVALUE 30; --최대값 30
시퀀스를 이용해 데이터를 넣어보죠!
INSERT INTO dept01 VALUES (
dept_seq.NEXTVAL,
'개발부'
);
INSERT INTO dept01 VALUES (
dept_seq.NEXTVAL,
'편집부'
);
INSERT INTO dept01 VALUES (
dept_seq.NEXTVAL,
'판매부'
);
잘 들어간 것을 볼 수 있습니다!
이 때 다음과 같이 INSERT 문을 사용하면 에러가 발생됩니다.
INSERT INTO dept01 VALUES (
dept_seq.NEXTVAL,
'인사부'
); --오류
그 이유는 시퀀스를 생성할 때 정해준 최대값 30을 넘어버렸기 때문입니다~
이 때 시퀀스를 수정하여 최대값을 늘려주면 데이터 삽입이 가능합니다!
ALTER SEQUENCE dept_seq MAXVALUE 100; -- 최대값 100으로 증가
INSERT INTO dept01 VALUES (
dept_seq.NEXTVAL,
'인사부'
);
CACHE
CACHE 옵션은 메모리상에서 시퀀스 값을 관리하도록 하는 것입니다.
기본값은 20이며, CHCHE 옵션을 사용하지 않으려면 NOCACHE 라고 해주시면 됩니다!
CREATE SEQUENCE dept_seq
INCREMENT BY 10
START WITH 10
CACHE 10;
CREATE SEQUENCE dept_seq
INCREMENT BY 10
START WITH 10
NOCACHE;
CYCLE
CYCLE 옵션은 만약 시퀀스의 값이 최대값을 넘으면 다시 최소값으로 되돌아가게 하는 것입니다!
CREATE SEQUENCE dept_seq02
INCREMENT BY 10
START WITH 10
MAXVALUE 30
MINVALUE 10 --cycle이 돌았을 때 최소값으로 이동
NOCACHE --CYCLE을 이용하려면 캐시보다 크게 max를 잡아주어야함 아니면 캐쉬 사용하지 않아야함
CYCLE;
한 번 실습해볼까요??
위의 시퀀스를 이용해서 dept02 테이블에 데이터를 삽입하겠습니다!
CREATE TABLE dept02 (
deptno NUMBER,
deptname VARCHAR2(30)
);
INSERT INTO dept02 VALUES (
dept_seq02.NEXTVAL,
'개발부'
);
INSERT INTO dept02 VALUES (
dept_seq02.NEXTVAL,
'편집부'
);
INSERT INTO dept02 VALUES (
dept_seq02.NEXTVAL,
'판매부'
);
INSERT INTO dept02 VALUES (
dept_seq02.NEXTVAL,
'인사부'
);