본문 바로가기
SQL_SCRIPT

시퀀스 조회 및 생성하기. #1

by 이노닝 2023. 7. 19.

안녕하세요.

이번에는 데이터베이스 시퀀스에 대해 간략하게 작성 하고자 합니다.

DB sequence 는 말 그대로 순서를 의미합니다.

예를 들면

도서관에 (가가0000 ~ 하하9999) 이런식으로 도서 번호가 매겨져 있는데요.

어떤 기준에 따라 작성된 번호를 매긴 것으로 보여집니다. (도서관 취향차이)

같은 책이더라도 번호는 각각 다릅니다.

이렇게 도서관 관리자(사서)는 중복되지 않는 유일한 도서 번호를 알고 있습니다.

새로운 책이 오면 도서관관리자(사서)가 도서 번호를 매기고 책에 표시를 합니다.

우리들이 보기엔 도서 번호가 안붙혀져 있는 책을 볼 수가 없죠?

마치 자동으로 생긴 것처럼 말이죠.

새로운 책이 오면 도서 번호를 주기하는 역활이 시퀀스입니다.

Oracle 과 PostgreSQL 문법이 조금 씩 다른데요.

이 장에서는 Oracle 만 먼저 다루겠습니다.

시퀀스 조회 (Select Sequence)

SELECT 시퀀스명.currVal FROM DUAL;

ex)
SELECT NONI_SEQ.currVal FROM DUAL;

여기서 NONI_SEQ는 시퀀스 명이 되고,

currVal 은 현재 시퀀스의 값을 의미합니다.

 

 

시퀀스 생성 (Create Sequence)

CREATE SEQUENCE 시퀀스명 ;

ex)
CREATE SEQUENCE NONI_SEQ START WITH 1 INCREMENT BY 1;

CREATE SEQUENCE 로 기본적으로 들어갑니다.

START WITH 1 은 첫 데이터 입력시 1번으로 사용하겠다 라는 의미입니다.

INCREMENT BY 증가 수치는 1단위네요.

 

 

시퀀스 삽입 (Insert Sequence )

INSERT INTO 테이블명(컬럼1, 컬럼2, 컬럼3) 
       VALUES(시퀀스명.nextVal, '데이터1', '데이터2');

ex)
INSERT INTO TN_NONI_CONTEXT(UID, CONTENT, USE_AT)
       VALUES(NONI_SEQ.nextVal, 'SequenceExample', 'Y');

생성된 Sequence Insert 하는 스크립트입니다.

XML 작성이나, 컨테이너 작성할 때 참고하면 좋을 것 같네요.

하지만, 이 방법은 절대적으로 좋은 방법이 아닙니다. 하단에 추가로 또 작성하였습니다.

 

 

 

시퀀스 삭제 (Drop Sequence)

DROP SEQUENCE 시퀀스명;

ex)
DROP SEQUENCE NONI_SEQ:

 

 

시퀀스 수정 (ALTER Sequence)

ALTER SEQUENCE 시퀀스명 옵션들;

ex)
ALTER SEQUENCE NONI_SEQ maxValue 9999;

시퀀스 수정은 가급적 권장하지 않습니다.

 

이렇게 간단하게 시퀀스에 대해 작성해봤는데요.

이 부분은 꼭 읽고가세요.

시퀀스는 위험한 요소가 다분합니다.

모든 개발자가 Current Version 으로 소스를 항상 최신버전을 유지 하는 것이 아니기에,

nextVal 사용 시 시퀀스의 번호가 뒤죽박죽으로 섞일 가능성이 높습니다.

 

실제 운영에 반영된 소스라면 더더욱 위험한 상황이 발생되겠죠.

따라서 시퀀스를 Insert 할때에는 MAX 함수를 이용하여 데이터를 적재합니다.

INSERT INTO 테이블명(컬럼1, 컬럼2, 컬럼3) 
       VALUES( (SELECT MAX(컬럼1)+1 
                FROM 테이블명)
                , '데이터1', '데이터2');

ex)
INSERT INTO TN_NONI_CONTEXT(UID, CONTENT, USE_AT)
       VALUES( (SELECT MAX(UID)+1 
                FROM TN_NONI_CONTEXT) , 'SequenceExample', 'Y');

위와 같이 사용해야 개발자간의 시간 편차로 인한 데이터 적재 오류가 발생될 가능성이 낮아집니다.

오라클 시퀀스는 여기까지 작성하고

다음번에는 PostgreSQL로 작성하겠습니다.