Programming/Database (Oracle, SQL)

[Oracle/SQL] 시퀀스 (Sequence)

Sujin Lee (Daisy) 2020. 2. 16. 22:22

0. 시퀀스란?

 - 자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체.

 - 보통 PK값에서 중복발생 방지를 위하여 사용

 

 

1. 개괄 

 1) 생성

CREATE SEQUENCE 시퀀스명	-- 시퀀스명: table명_컬럼명_seq
	START WITH 1			-- 1부터 시작 
    INCREMENT BY 1			-- 1씩 증가 
    NOCACHE					-- 캐시 사용X 
    NOCYCLE;				-- NOCYCLE 설정시 최대값 생성 시 시퀀스 생성을 중지한다.

 - start with, increment by, nocache, nocycle이 무엇인지 궁금하다면 아래의 '2. 옵션' 참고 

2) 삭제

DROP SEQUENCE 시퀀스명; 

3) 조회 - 전체 시퀀스 조회

 - 만들어져 있는 모든 시퀀스를 조회한다. 

SELECT * FROM USER_SEQUENCES;

4) 조회 - 특정 시퀀스 조회 

SELECT 시퀀스명 FROM DUAL;

 

 

2. 옵션

 1) start with

  - 시작번호

 2) increment by

  - 증감단위. 증감숫자가 양수면 증가, 음수면 감소. 디폴트는 1. 

 3) cache | nocache

  - 메모리에 시퀀스값을 미리 할당할 것인지 (cache) 말 것인지 (nocache)

 4) cycle | nocycle

  - cycle : 시퀀스 값이 최대값에 도달하면 최소값부터 다시 시작한다.

  - nocycle : 시퀀스 값이 최대 값에 도달하면 시퀀스 생성을 중지한다. 

 5) max_value 

  - 시퀀스의 최대값을 지정

 6) min_value

  - 시퀀스의 최소값을 지정 

 

 

3. CURRVAL, NEXTVAL

 - CURRVAL : 현재 시퀀스를 확인한다. (current value) 

 - NEXTVAL : 해당 시퀀스의 값을 증가시킨다. (next value)

 - 주의사항) SELECT만 해도 NEXTVAL을 썼을 경우 시퀀스 값을 증가시킨다! 

 - 주의사항) 시퀀스와 테이블은 독립적이다! 

-- board3 테이블 생성 
CREATE TABLE board3(
	no NUMBER PRIMARY KEY,
    name VARCHAR2(20) NOT NULL
);

-- board3_no_seq 시퀀스 생성 
CREATE SEQUENCE board3_no_seq
	START WITH 1
    INCREMENT BY 1
    NOCYCLE
    NOCACHE;
    
INSERT INTO board3 VALUES (board3_no_seq.nextval, '쑤'); --시퀀스=1. 
SELECT board3_no_seq.currval FROM DUAL; -- 시퀀스=1
SELECT board3_no_seq.nextval FROM DUAL; -- 시퀀스=2
INSERT INTO board3 VALUES (board3_no_seq.nextval, '최밍밍'); --시퀀스=3.
-- SELECT만 해도 nextval을 쓰면 시퀀스 값이 증가한다.

SELECT * FROM board3;
-- 결과) board3의 데이터는 아래와 같음
-- no   name
--  1   쑤
--  3   최밍밍

DELETE FROM board3 WHERE no=3;
INSERT INTO board3 VALUES(board3_no_seq.nextval, '일리윤'); --시퀀스=4
-- 테이블 행을 삭제한다고 해서 시퀀스 값이 1씩 당겨지지 않는다!
-- 시퀀스와 테이블은 독립적. 별도로 움직인다. 

SELECT * FROM board3;
-- 결과) board3의 데이터는 아래와 같음
-- no   name
--  1   쑤
--  4   일리윤

 

반응형