시퀀스(sequence)
1. 시퀀스
시퀀스는 유일한 값을 생성해주는 오라클 객체이다.
시퀀스를 생성하면 기본 키와 같이 순차적으로 증가하는 칼럼을 자동적으로 생성할 수 있게 된다.
CREATE SEQUENCE [시퀀스 이름]
[START WITH 시작번호]
[INCREMENT BY 증가단위]
[MAXVALUE 최대값]
[MINVALUE 최소값]
[CYCLE | NOCYCLE]
[CACHE | NOCACHE]
1) START WITH
시퀀스의 시작값을 지정 (생략 시 DEFAULT : 1)
2) INCREMENT BY
시퀀스의 증가값, 예를들어 n을 2로 설정하면 1,3,5,7 순으로 시퀀스 번호 증가 (생략 시 DEFAULT : 1)
3) MAXVALUE
시퀀스가 증가할 수 있는 최대값 (생략 시 DEFAULT : 해당 오라클 버전에서의 시퀀스 최대값)
4) MINVALUE
시퀀스의 최솟값 (생략 시 DEFAULT : 1)
5) CYCLE | NOCYCLE
지정된 시퀀스 값이 최댓값까지 증가가 완료되면 다시 최솟값에서부터 시퀀스를 시작하도록 하려면 cycle로 지정. nocycle은 최대값이 넘어서면 오류값이 발생 (생략 시 DEFAULT : NOCYCLE)
6) CACHE | NOCACHE
오라클 서버가 미리지정하고 메모리에 유지할 값의 수 (생략 시 DEFAULT : 2)
Q) 시작 값이 1이고 1씩 증가하고, 최댓값이 100000이 되는 시퀀스 EMP_SEQ 생성
SQL> CREATE SEQUENCE EMP_SEQ
START WITH 1
INCREMENT BY 1
MAXVALUE 100000;
Q) EMP_SEQ 시퀀스로부터 사원번호를 자동으로 하당 받아 데이터를 추가
SQL> INSERT INTO EMP01
VALUES(EMP_SEQ.NEXTVAL, 'JULIA', SYSDAE);
시퀀스의 현재 값을 알고 싶을 때는 CURRVAL를 사용한다
CURRVAL : 현재 값을 반환
NEXTVAL : 현재 시퀀스 값의 다음 값을 반환
Q) EMP_SEQ 시퀀스의 현재 값을 알아봄
SQL> SELECT EMP_SEQ.CURRVAL
FROM DUAL;
NEXTVAL 및 CURRVAL을 사용할 수 있는 경우
- 서브쿼리가 아닌 SELECT문
- INSERT문의 SELECT절
- INSERT문의 VALUE절
- UPDATE문의 SET절
NEXTVAL 및 CURRVAL을 사용할 수 없는 경우
- VIEW의 SELECT절
- DISTINCT 키워드가 있는 SELECT문
- GROUP BY, HAVING, ORDER BY절이 있는 SELECT문
- SELECT, DELETE, UPDATE의 서브쿼리
- CREATE TABLE, ALTER TABLE 명령의 DEFAULT값
2. 시퀀스 수정
시퀀스에 관한 데이터 딕셔너리 USER_SEQUENCES
생성된 시퀀스에 정보를 확인하기 위한 데이터 딕셔너리로 USER_SEQUENCES가 있다.
USER_SEQUENCES 데이터 딕셔너리로 시퀀스의 정보를 확인
SQL> SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
시퀀스 값을 변경하려면 ALTER SEQUENCE문을 사용해야 한다.
ALTER SEQUENCE sequence_name
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
ALTER SEQUENCE는 START WITH 절이 없다는 점을 빼고는 CREATE SEQUENCE와 구조가 동일
START WITH 옵션은 ALTER SEQUENCE를 써서 변경할 수 없다.
다른 번호에서 다시 시작하려면 이전 시퀀스를 삭제하고 다시 생성해야 한다.
3. 시퀀스 삭제
시퀀스를 삭제하려면 DROP SEQUENCE를 사용한다
DROP SEQUENCE sequence_name;
Q) 더 이상 사용되지 않는 시퀀스를 삭제
SQL> DROP SEQUENCE DEPT_SEQ;
USER_SEQUENCES 데이터 딕셔너리로 시퀀스가 삭제되었는지를 확인
SQL> SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;