본문 바로가기

DB/Oracle

Oracle DB #12 시퀀스

1. 시퀀스

 

1) 시퀀스 개념 이해와 시퀀스 생성

- 오라클에서는 행을 구분하기 위해서 기본 키를 두고 있습니다.  기본 키는 중복된 값을 가질 수 없으므로 항상 유일한 값을 가져야 함

- 기본 키가 유일한 값을 갖도록 사용자가 직접 값을 생성해내려면 부담이 클 것임

- 시퀀스는 테이블 내의 유일한 숫자를 자동으로 생성하는 자동 번호 발생기이므로 시퀀스를 기본 키로 사용하게 되면 사용자의 부담을 줄일 수 있음

 

2) 시퀀스 기본 형식

CREATE SEQUENCE sequence_name

                [START WITH n]                            ①

                [INCREMENT BY n]                        ②

                [{MAXVALUE n | NOMAXVALUE}]     ③

                [{MINVALUE n | NOMINVALUE}]      ④

                [{CYCLE | NOCYCLE}]                      ⑤

                [{CACHE n | NOCACHE}]                 ⑥

 

 

① START WITH

- 시퀀스 번호의 시작값을 지정할 때 사용됩니다. 만일 1부터 시작되는 시퀀스를 생성하려면 START WITH 1이라고 기술하면 됨

② INCREMENT BY

- 연속적인 시퀀스 번호의 증가치를 지정할 때 사용됩니다. 만일 1씩 증가하는 시퀀스를 생성하려면 INCREMENT BY 1이라고 기술

③ MAXVALUE n | NOMAXVALUE

- MAXVALUE 은 시퀀스가 가질 수 있는 최대값을 지정합니다. 만일 NOMAXVALUE를 지정하게 되면 ASCENDING 순서일 경우에는 1027승이고 DESCENDING 순서일 경우에는 -1로 설정

④ MINVALUE n | NOMINVALUE

- MINVALUE 은 시퀀스가 가질수 있는 최소값을 지정합니다. 만일 NOMINVALUE을 지정하게 되면 ASCENDING 순서일 경우에는 1이고 DESCENDING 순서일 경우에는 1026승으로 설정

⑤ CYCLE | NOCYCLE

- CYCLE 은 지정된 시퀀스 값이 최대값까지 증가가 완료되게 되면 다시 START WITH 옵션에 지정한 시작 값에서 다시 시퀀스를 시작하도록 합니다. NOCYCLE은 증가가 완료되게 되면 에러를 유발

⑥ CACHE n | NOCACHE

- CACHE 은 메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본 값은 20입니다. NOCACHE는 원칙적으로 메모리 상에서 시퀀스를 관리하지 않음

 

부서 번호를 자동으로 부여해주는 시퀀스 객체를 생성하는 문장을 만들어보자

CREATE SEQUENCE DEPT_DEPTNO_SEQ

INCREMENT BY 10

START WITH 10;

 

시작 값이 10 이고 10씩 증가하는 시퀀스 DEPT_DEPTNO_SEQ 을 생성

 

3) 시퀀스 관련 데이터 딕셔너리

- 사용자가 작성한 객체들의 정보를 저장하고 있는 데이터 딕셔너리의 이름을 보면 다음과 같은 규칙성이 있음

- 테이블(TABLE) 객체에 대한 정보를 저장하는 데이터 딕셔너리는 USER_TABLES이고, 뷰(VIEW)객체에 대한 정보를 저장하는 데이터 딕셔너리는 USER_VIEWS이므로 이번 장에서 새로 배운 시퀀스(SEQUENCE)에 대한 자료사전의 이름은 USER_SEQUENCES 이라고 사료될 것

- 생성된 시퀀스 객체에 대한 정보를 저장하는 데이터 딕셔너리로는 USER_SEQUENCES가 있음

 

4) CURRVAL, NEXTVAL

CURRVAL : 현재 값을 반환한다.

NEXTVAL : 현재 시퀀스 값의 다음 값을 반환한다

- 시퀀스의 현재 값을 알아내기 위해서 CURRVAL를 사용하고,   다음 값을 알아내기 위해서는 NEXTVAL를 사용

- CURRVAL에 새로운 값이 할당되기 위해서는 NEXTVAL로 새로운 값을 생성

- NEXTVAL로 새로운 값을 생성한 다음에 이 값을 CURRVAL에 대체하게 됨

 

- 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 값