📘 DATABASE/ORACLE

시퀀스(sequence)

개발진스 2023. 4. 17. 12:56
728x90

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;

728x90