SEQUENCE

EUNJI LEE·2023년 4월 13일
0

SQL

목록 보기
11/14

SEQUENCE

자동으로 중복되지 않는 번호를 발급해주는 객체로 타입은 NUMBER로 받는다. 기본 SEQUENCE 생성은 CREATE SEQUENCE 시퀀스명 [옵션...]; 으로 한다. 옵션은 생략 가능하며 옵션 없이 생성하면 시퀀스는 기본으로 1부터 시작해서 1씩 증가한다.

SEQUENCE는 중복되지 않는 숫자를 발급해주기 때문에 TABLE에 PRIMARY KEY 컬럼에 많이 사용한다. SEQUENCE 번호를 발급하려면 시퀀스명.NEXTVAL 을 선언하고, 현재 값을 확인하려면 시퀀스명.CURRVAL을 사용한다.

--SEQUENCE 생성
CREATE SEQUENCE SEQ_BASIC;

SELECT SEQ_BASIC.NEXTVAL FROM DUAL; -->실행할 때마다 자동으로 번호가 부여된다.
--현재 SEQUENCE 값 확인
-->NEXTVAL가 한 번 실행한 뒤에 확인할 수 있다.
SELECT SEQ_BASIC.CURRVAL FROM DUAL;

--게시글 테이블에 게시글 번호로 SEQUENCE 사용
INSERT INTO BOARD VALUES(
				SEQ_BASIC.NEXTVAL,'첫번째 게시글','첫번째 게시글입니다.','USER01',SYSDATE);
INSERT INTO BOARD VALUES(
				SEQ_BASIC.NEXTVAL,'중복 게시글','중복 게시글 테스트입니다.','USER01',SYSDATE);

--첨부파일 테이블을 생성해서 SEQUENCE 활용
CREATE TABLE ATTACHMENT(
    ATTACH_NO NUMBER PRIMARY KEY,
    BOARD_REF NUMBER REFERENCES BOARD(BOARD_NO),
    FILENAME VARCHAR2(200) NOT NULL
);
INSERT INTO BOARD VALUES(
			SEQ_BASIC.NEXTVAL,'첨부파일게시글','첨부파일있음','USER01',SYSDATE);
INSERT INTO ATTACHMENT VALUES(1, SEQ_BASIC.CURRVAL,'내사진.png');
INSERT INTO ATTACHMENT VALUES(2, SEQ_BASIC.CURRVAL,'내사진2.png');

SEQUENCE 옵션

START WITH 숫자

시작 번호를 설정해주는 옵션. DEFULAT 값은 1이기 때문에 따로 설정하지 않으면 1부터 시작한다.

CREATE SEQUENCE SEQ_01
START WITH 100; -->시작 값이 100

SELECT SEQ_01.NEXTVAL FROM DUAL; -->100출력. 재실행 시 101 출력

INCREMENT BY 숫자

증가 값을 설정해주는 옵션. 기본 값은 1이다.

CREATE SEQUENCE SEQ_02
START WITH 100
INCREMENT BY 10; -->NEXTVAL을 실행하면 10씩 증가한다.

SELECT SEQ_02.NEXTVAL FROM DUAL; -->100 출력. 재실행 시 110 출력

MAXVALUE/MINVALUE 숫자

최댓값/최솟값을 설정해주는 옵션

CREATE SEQUENCE SEQ_03
START WITH 100
INCREMENT BY -50
MAXVALUE 200 -->최댓값 200
MINVALUE 0; -->최솟값 0
SELECT SEQ_03.NEXTVAL FROM DUAL;
-->실행 시 마다 -50씩 감소하기 때문에 3번째 실행했을 때, 오류가 발생한다.
--⚠️ORA-08004: 시퀀스 SEQ_03.NEXTVAL goes below MINVALUE은 사례로 될 수 없습니다
-->기본적으로 NOCYCLE 옵션을 가지기 때문

CYCLE/NOCYCLE

번호가 최댓값이 되면 최솟값으로 돌아가서 순환할지 말지 정하는 옵션이다. 최대,최소 값이 존재해야 된다.

CREATE SEQUENCE SEQ_04
START WITH 100
INCREMENT BY 50
MAXVALUE 200
MINVALUE 0
CYCLE; 
SELECT SEQ_04.NEXTVAL FROM DUAL;
-->⚠️ORA-04013: CACHE 에는 1 사이클보다 작은 값을 지정해야 합니다
💡 SEQUENCE는 기본적으로 CACHE 옵션을 갖고 있기 때문에 해당 쿼리문에서 오류가 발생하게 된다. 처음부터 20개의 SEQUENCE를 뽑아내면서 시작하기 때문에 최댓값을 초과하게 돼서 오류가 발생한다.

CACHE

미리 번호를 생성하는 기능으로 기본 값으로는 20씩 생성한다. 기본적으로 CACHE가 설정되어있고 캐시를 만들지 않으려면 NOCACHE 설정해준다.

CREATE SEQUENCE SEQ_05
START WITH 100
INCREMENT BY 50
MAXVALUE 200
MINVALUE 0
CYCLE
NOCACHE;
-->SEQ_04와 다르게 정상 실행 된다.

SEQUENCE 특이사항

  1. CURRVAL를 호출하려면 같은 SESSION안에서 NEXTVAL를 한 번이라도 실행하고 호출해야한다.

    CREATE SEQUENCE SEQ_05;
    SELECT SEQ_05.CURRVAL FROM DUAL;
    --⚠️ORA-08002: 시퀀스 SEQ_05.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다
    SELECT SEQ_05.NEXTVAL, SEQ_05.CURRVAL FROM DUAL;
  2. SEQUENCE에 값을 추가해서 PK값으로 사용할 수 있다. P_001, P_002처럼 문자열로 사용 가능하다. 시퀀스와 문자열을 연산해서 기본키로 지정하는 경우 기본키는 당연히 문자열 타입으로 지정해야한다.

SELECT 'P_'||LPAD(SEQ_05.NEXTVAL,4,'0') FROM DUAL; -->범위가 한정적
-->PK를 문자열로 받을 수 있게 해야한다.
--생성 날짜를 추가해서 중복되지 않는 값 부여
SELECT TO_CHAR(SYSDATE,'YYYYMMDD')||'_'||SEQ_05.NEXTVAL FROM DUAL;
profile
천천히 기록해보는 비비로그

0개의 댓글