본문 바로가기

Database

[SQL] 시퀀스 SEQUENCE


SEQUENCE 시퀀스 

-자동으로 번호를 발생시켜주는 역할을 하는 객체
- 정수값을 자동으로 순차적으로 생성해줌
    --> 일련번호를 부여하여 자동증가 값을 생성
- 독립적인 객체로, 테이블과는 별개로 동작

예) 회원번호, 사번, 게시글번호 등등 채번시 사용 


시퀀스 객체 생성방법

CREATE SEQUENCE 시퀀스명 

(START WITH 시작숫자)            처음 발생시킬 시작값 지정 [DEFAULT 1] / 변경(ALTER)불가!
(INCREMENT BY 증가값)            몇 씩 증가시킬건지 지정, [DEFAULT 1]
(MAXVALUE)                      최대값지정
(MINVALUE)                      최솟값지정 [DEFAULT 1]
(CYCLE /NOCYCLE)                값 순환여부 지정 [DEFAULT NOCYCLE]
(CACHE 바이트크기 / NOCACHE)     캐시메모리 사용여부, 기본값 20byte
;

**** SEQUENCE CACHE MEMORY:  미리 발생할 값들을 생성해서 저장해두는 공간
    매번 호출시마다 새로 번호를 생성하는 것은 비효율적. 
    캐시메모리 공간에 미리 생성된 값들을 가져다 쓰게하여 속도를 높임
CREATE SEQUENCE SEQ_EMPNO
START WITH 300 -- 지삭값
INCREMENT BY 5 --증가값
MAXVALUE 310 -- 최대값
NOCYCLE-- 반복 X
NOCACHE; --캐시사용 X

 

CREATE SEQUENCE MEM_ORDER
START WITH 10
INCREMENT BY 1
MINVALUE 5
MAXVALUE 15
CYCLE
CACHE 10; 

SELECT MEM_ORDER.CURRVAL FROM DUAL;
SELECT MEM_ORDER.NEXTVAL FROM DUAL;

CURRVAL, NEXTVAL


* 시퀀스 값 증가 Operator => NEXTVAL
* 현재 시퀀스 조회Operator => CURRVAL 
   (NEXTVAL 최초 1회 실행 후 CURRVAL조회가능)

*CURRVAL, NEXTVAL 사용이 가능한 구문
- 서브쿼리가 아닌 SELECT문
 - INSERT문의 SELECT절
 - INSERT문의 VALUE절  
- UPDATE문의 SET절


시퀀스명.CURRVAL : 현재 시퀀스값 (마지막으로 성공적으로 발생된 NEXTVAL 값)
시퀀스명.NEXTVAL : 시퀀스값을 증가시키고 증가된 시퀀스값
                            기존의 시퀀스값에서 INCREMENT BY값만큼 증가된 값
                            (시퀀스명.CURRVAL + INCREMENT BY값)
SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
-- ORA-08002: sequence SEQ_EMPNO.CURRVAL is not yet defined in this session
--> NEXTVAL을 1회이상 수행하지 않으면 CURRVAL은 수행할 수 없음

SELECT * FROM USER_SEQUENCES;
 -- LAST NUMBER: 현 상황에서 NEXTVAL을 실행할 경우 예정 값 
 
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 300
SELECT SEQ_EMPNO.CURRVAL FROM DUAL 300
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 305
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 310
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 
-- ORA-08004: sequence SEQ_EMPNO.NEXTVAL exceeds MAXVALUE and cannot be instantiated
SELECT SEQ_EMPNO.CURRVAL FROM DUAL;



시퀀스 변경

ALTER SEQUENCE 시퀀스명
**시작값은 변경불가, 나머지는 변경가능
ALTER SEQUENCE SEQ_EMPNO
INCREMENT BY 10
MAXVALUE 400;

SELECT SEQ_EMPNO.CURRVAL FROM DUAL;  --310
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL;  --320
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; --330


---------------------------------------------------------------

CREATE SEQUENCE SEQ_EID
START WITH 300;

INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, JOB_CODE ,SAL_LEVEL)
VALUES ( SEQ_EID.NEXTVAL, '시퀀스맨', '123123123', 'J3', 'S3');

INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, JOB_CODE ,SAL_LEVEL)
VALUES ( SEQ_EID.NEXTVAL, '시퀀스맨2', '123123123', 'J3', 'S3');

SELECT * FROM EMPLOYEE;


 

'Database' 카테고리의 다른 글

[SQL] 뷰 VIEW  (1) 2022.10.05
[SQL] TCL(COMMIT, ROLLBACK, SAVEPOINT)  (1) 2022.10.05
[SQL] DCL - GRANT, REVOKE  (1) 2022.10.05
[SQL] DDL - CREATE/ ALTER/ DROP  (0) 2022.10.05
[SQL] DML - INSERT/ UPDATE /DELETE  (0) 2022.10.04