DB/Oracle

[Oracle] 오라클 시퀀스(Sequence) 사용법 총정리 (생성, 조회, 수정, 삭제)등

코딩팩토리 2019. 11. 7. 01:30

     

    시퀀스(Sequence)란?

    시퀀스란 자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체입니다. 보통 PK값에 중복값을 방지하기위해 사용합니다. 예를들어 게시판에 글이 하나 추가될때마다 글번호(PK)가 생겨야 한다고 해보겠습니다. 만약 100번까지 글 번호가 생성되어있다면 그 다음 글이 추가가 되었을 경우 글 번호가 101으로 하나의 ROW를 생성해주어야 할것입니다. 이때 101이라는 숫자를 얻으려면 기존 글번호중 가장 큰 값에 +1을 하는 로직을 어딘가에 넣어야하는데 시퀀스를 사용하면 이러한 로직이 필요없이 데이터베이스에 ROW가 추가될때마다 자동으로 +1을 시켜주어 매우 편리합니다.

     

    시퀀스(Sequence) 생성

    --문법
    CREATE SEQUENCE [시퀀스명]
    INCREMENT BY [증감숫자] --증감숫자가 양수면 증가 음수면 감소 디폴트는 1
    START WITH [시작숫자] -- 시작숫자의 디폴트값은 증가일때 MINVALUE 감소일때 MAXVALUE
    NOMINVALUE OR MINVALUE [최솟값] -- NOMINVALUE : 디폴트값 설정, 증가일때 1, 감소일때 -1028 
                                   -- MINVALUE : 최소값 설정, 시작숫자와 작거나 같아야하고 MAXVALUE보다 작아야함
    NOMAXVALUE OR MAXVALUE [최대값] -- NOMAXVALUE : 디폴트값 설정, 증가일때 1027, 감소일때 -1
                                   -- MAXVALUE : 최대값 설정, 시작숫자와 같거나 커야하고 MINVALUE보다 커야함
    CYCLE OR NOCYCLE --CYCLE 설정시 최대값에 도달하면 최소값부터 다시 시작 NOCYCLE 설정시 최대값 생성 시 시퀀스 생성중지
    CACHE OR NOCACHE --CACHE 설정시 메모리에 시퀀스 값을 미리 할당하고 NOCACHE 설정시 시퀀스값을 메로리에 할당하지 않음
    --예제
    CREATE SEQUENCE EX_SEQ --시퀀스이름 EX_SEQ
    INCREMENT BY 1 --증감숫자 1
    START WITH 1 --시작숫자 1
    MINVALUE 1 --최소값 1
    MAXVALUE 1000 --최대값 1000
    NOCYCLE --순한하지않음
    CACHE; --메모리에 시퀀스값 미리할당

    시퀀스 생성

    위와같이 쿼리를 날리면 시퀀스가 생성됩니다. 위 예제를 설명하자면 이 시퀀스는 EX_SEQ라는 시퀀스이고 1부터 시작해 1씩 증가하며 시작값은 1부터 1000까지 순번을 자동하는 시퀀스입니다. Cache를 사용하여 시퀀스값의 액세스 효율이 Cache를 사용하지 않았을때보다 증가합니다. 

    ※ 위 쿼리를 조금만 변형하면 2씩 증가하는 시퀀스, 큰 수에서 작은수로 감소하는 시퀀스도 생성할 수 있습니다.

     

    시퀀스(Sequence) 사용 예시

    CREATE TABLE EX_TABLE (BOARD_NUM NUMBER(19,6) NOT NULL);
    

    1. 테스트 할 간단한 TEST 테이블을 만듭니다.

    INSERT INTO EX_TABLE(BOARD_NUM) VALUES(EX_SEQ.NEXTVAL);
    INSERT INTO EX_TABLE(BOARD_NUM) VALUES(EX_SEQ.NEXTVAL);
    INSERT INTO EX_TABLE(BOARD_NUM) VALUES(EX_SEQ.NEXTVAL);

    2. 위에서 만들었던 EX_SEQ 시퀀스로 TEST테이블에 데이터를 넣습니다.

    SELECT * FROM EX_TABLE
    

    3. 넣었던 데이터를 SELECT문으로 확인해봅니다.

     

    시퀀스 사용

    4. 위와같이 1, 2, 3이라는 값이 순차적으로 INSERT된것을 볼 수 있습니다. 시퀀스명.NEXTVAL을 사용하면 해당 시퀀스에서 다음 순번 값을 자동으로 가져옵니다.

     

    시퀀스(Sequence) 조회

    SELECT EX_SEQ.CURRVAL FROM DUAL --해당 시퀀스 값 조회
    SELECT * FROM USER_SEQUENCES  --전체 시퀀스 조회

    시퀀스 조회

     

    시퀀스(Sequence) 수정

    --문법
    ALTER SEQUENCE [시퀀스명]
    INCREMENT BY [증가값]
    NOMINVALUE OR MINVALUE [최솟값] 
    NOMAXVALUE OR MAXVALUE [최대값]
    CYCLE OR NOCYCLE [사이클 설정 여부]
    CACHE OR NOCACHE [캐시 설정 여부]
    --예제
    ALTER SEQUENCE EX_SEQ
    INCREMENT BY 2
    MINVALUE 2
    MAXVALUE 10000
    CYCLE
    NOCACHE;

    시퀀스는 DDL문이므로 ALTER문을 사용하여 수정이 가능합니다. 시작값은 수정이 불가능합니다. 그리고 현재 들어있는 값보다 높은 최솟값(감소 시퀀스일 경우 그 반대)로도 설정할 수 없습니다.

    시퀀스 수정

     

    시퀀스(Sequence) 삭제

    --문법
    DROP SEQUENCE [시퀀스명]
    
    --예제
    DROP SEQUENCE EX_SEQ

    시퀀스 삭제