본문 바로가기

.주제별/SQL,DB

SQL)강의- 제 13 장 Sequence 생성

출처 : http://naver.kaist.ac.kr/oracle_sql/s13.htm

 

1. Sequenc 생성

    ◈ 자동적으로 순차적인 숫자를 생성하기 위해 Sequenc를 정의한다.

      CREATE SEQUENC NAME

      [INCREMENT BY n]
      [START WITH n]
      [{MAXVQLUE n | NOMAXVALUE}]
      [{MINVALUE n | NOMINVALUE}]
      [{CYCLE | NOCYCLE}]
      [{CACHE n | NOCACHE}]

    ◈INCREMENT BY n은 Sequenc번호간의 간격인 정수 n이며, 생략되면 Sequenc는 1씩 증가
    ◈START WITH n은 생성되는 첫 번째 Sequenc번호로 생략되면 시퀀스는 1씩 증가
    ◈MAXVALUE n은 생성가능한 Sequenc의 최대값
    ◈NOMAXVALUE는 기본 옵션으로 최대값은 1027
    ◈MINVALUE n은 생성가능한 Sequenc의 최소값
    ◈NOMINVALUE최소값1
    ◈CACHE n|NOCACHE는 Oracle Sever가 미리 지정하고 메모리에 유지할 값의 수로
       Default값은 20이다.

    ♠실습 : s_dept 테이블의 dept_id column 에 사용할 sequence인 s_dept_id를 만들라.
               sequence는 51에서 시작 한다. 캐쉬와 cycle을 하지 않게 하라.

    SQL> CREATE SEQUENCE s_dept_id
              INCREMENT BY   1
              START WITH   51
              MAXVALUE   9999999
              NOCACHE
              NOCYCLE;

    ※Sequence가 Primary Key값을 생성한다면 CYCLE 옵션을 쓰지 말라.
     

Sequence 확인

    ◈ Sequence를 생성하면 data dictionary에 기록된다.
    ◈ Sequence가 데이터베이스 객체이므로 USER_OBJECTS dictionary에서 볼 수 있다.
    ◈ 데이터 사전의 USER_SEQUENCES 테이블을 참조하면 설정된 사항을 확인할 수 있다.

    ♠실습 : 자신이 소유한 모든sequence정보를 출력하시오.

    SQL> SELECT sequence_name, min_value, max_value,  increment_by, last_number
              FROM   user_sequences;

     

2. Sequence 이용

    ◈ 시퀀스를 만들면 테이블에서 사용할 순차적인 번호를 생성하기 위해 시퀀스를 이용할 수 있다.

    ◈ NEXTVAL과 CURRVAL Pseudocolumn을 써서 Sequence 값을 참조하라.
    ♠실습 : 지역2에 "Finance"라는 입력을 삽입하라.

    SQL> INSERT INTO s_dept(id, name, region_id)
                VALUES (s_dept_id.NEXTVAL, 'Finance', 2);

     

    ♠실습 : S_DEPT_ID Sequence에 대한 현재 값을 보라.

    SQL> SELECT s_dept_id,CURRVAL FROM SYS,dual;

     

NEXTVAL과 CURRVAL 의사 Pseudocolumn

    ◈NEXTVAL은 사용 가능한 다음 시퀀스값을 반환한다. - 매번 고유한 값을 반환한다.
    ◈CURRVAL은 현재 시퀀스값을 구한다. -CURRVAL은 NEXTVAL사용 후에 사용되어야 한다.
    ◈사용규칙을 따르라.
     

NEXTVAL과 CURRVAL 사용규칙

    ◈ 다음에서 NEXTVAL과 CURRVAL을 사용할 수 있다.

      - Subquery가 아닌 SELECT 문의 SELECT List
      - INSERT 문의 Subquery SELECT List
      - INSERT 문의 VALUE 절
      - UPDATE 문의 SET 절

    ◈ 다음에서 NEXTVAL과 CURRVAL을 사용할 수 없다.

      - 뷰의 SELECT List
      - DISTINCT 키워드가 있는 SELECT 문
      - GROUP BY, HAVING, 또는 ORDER BY 절이 있는 SELECT 문
      - SELECT, DELETE, 또는 UPDATE 문의 Subquery
      - CREATE TABLE 또는 ALTER TABLE 명령의 DEFAULT 값
       

Sequence 값의 캐슁

    ◈Sequence를 메모리에 캐쉬하면 Sequence 값을 더 빨리 액세스할 수 있다. 다음 Sequence값을
       요구하면 캐쉬된 Sequence에서 return해 준다.
     

증가 없이 다음 시퀀스 값 보기

    ◈NOCACHE로 Sequence가 생성될 경우에만 USER_SEQUENCES 테이블을 query를 하여 다음
       Sequence값을 볼 수 있다.

     

3. Sequenc 변경/삭제

    ◈증가값, 최대 값, 최소 값, 순환옵션, 캐쉬 옵션을 변경한다.
    ◈Sequence에 대한 MAXVALUE 한계에 도달하면 Sequence에 대한 추가적인 값이 할당되지 않게
       되고 Sequence가 MAXVALUE를 넘었음을 알리는 오류 메시지를 받게 됩니다. 이때Sequence를
       계속 사용하려면 ALTER SEQUENCE 명령을 써서 수정할 수 있다. 
     

가. Sequenc 변경

    ♣ Syntax

      ALTER SEQUENCE NAME

      [INCREMENT BY n]

      [{MAXVALUE n │ NOMAXVALUE}]

      [{MINVALUE n │ NOMINVALUE}]

      [{CYCLE │ NOCYCLE}]

      [{CACHE n│ NOCACHE}]

     

    ◈자신의 Sequence이거나 Sequence에 대한 ALTER 권한을 가져야만 Sequence를 수정할 수 있다.
    ◈아직 생성되지 않은 시퀀스값만이 ALTER SEQUENCE명령에 영향받는다.
    ◈유효성 검사를 하게 된다. 예를 들어 새로운 MAXVALUE는 현재의 순서 번호보다 작지 않아야 한다.
    ◈START WITH 옵션은 ALTER SEQUENCE를 써서 변경할 수 없다. 다른 번호에서 다시 시작하려면
       이전 시퀀스를 삭제하고 다시 생성해야 한다.
     

나. Sequenc 삭제

    ◈DROP SEQUENCE명령을 사용하여 Sequence를 삭제한다.
    ◈Sequence가 삭제되면 더 이상 참조할 수 없다.
    ◈Sequence를 제거할 DROP ANY SEQUENCE 권한을 가지고 있거나 그 시퀀스의 소유자이어야 한다.
    ♣ Syntax : DROP SEQUENCE 시퀀스 이름;

     

다. Sequenc 요약

    ◈Sequence 사용하여 테이블의 행에 대한 primary key 값을 자동으로 생성한다.
    ◈데이터베이스 객체인 Sequence를 다른 사용자들과 공유할 수도 있다.
    ◈USER_SEQUENCES 테이블에 있는 정보를 참조할 수 있다.
    ◈Sequence.NEXTVAL을 이용하여 다음 값을 Return 받는다.
    ◈Sequence.CURRVAL을 이용하여 NEXTVAL 에 의해 Return된 마지막 값을 확인할 수 있다.