보통 시퀀스를 사용하는 부분은 테이블에서 기본키(Primary Key)를 생성하여 사용하기 위해 사용한다. 기본키다 보니 시퀀스의 숫자를 자동으로 증가시켜 중복이 안되는 고유키로 사용하는 것이다.
CREATE SEQUENCE 스키마명.시퀀스명
INCREMENT BY 1 --> 증가값(1씩 증가)
START WITH 1 --> 시작값
MINVALUE 1 --> 최솟값
MAXVALUE 1000 --> 최댓값
NOCYCLE --> 최댓값 도달시 시작값 부터 다시 반복
NOCACHE --> CACHE를 사용할지 여부
NOORDER; --> 요청 순서대로 값을 생성할지 여부
- INCREMENT BY : 시퀀스 실행 시 증가시킬 값
- START WITH : 시퀀스의 시작값(MINVALUE와 같거나 커야한다.)
- MINVALUE : 시퀀스가 시작되는 최솟값
- MAXVALUE : 시퀀스가 끝나는 최댓값
- NOCYCLE|CYCLE : NOCYCLE(반복안함), CYCLE(시퀀스의 최댓값에 도달 시 최솟값 1부터 다시시작)
- NOCACHE|CACHE : NOCACHE(사용안함), CACHE(캐시를 사용하여 미리 값을 할당해 놓아서 속도가 빠르며, 동시 사용자가 많을 경우 유리)
- NOORDER|ORDER : NOORDER(사용안함), ORDER(요청 순서로 값을 생성하여 발생 순서를 보장하지만 조금의 시스템 부하가 있다.)
CREATE SEQUENCE emp_seq
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9999
NOCYCLE
NOCACHE
NOORDER;
위의 시퀀스는 1부터 시작하여 9999까지 1씩 증가한다.
SELECT emp_seq.NEXTVAL
FROM dual
시퀀스명.NEXTVAL을 사용하여 일렬번호를 생성할 수 있다.
시퀀스를 실행할 때마다 값이 증가하니 주의해야 한다.
(증가된 값은 다시 내릴 수 없다.)
ALTER SEQUENCE emp_seq INCREMENT BY 2
시퀀스 증가값을 1에서 2로 변경
ALTER SEQUENCE emp_seq MAXVALUE 99999
시퀀스 최댓값을 9999에서 99999로 변경
SELECT * FROM NAME_SEQUENCES;
현재 계정의 모든 시퀀스의 데이터를 전부 보여준다.
DROP SEQUENCE emp_seq
시퀀스 값을 초기화 하기 위해서는 시퀀스를 삭제 후 다시 생성하거나, INCREMENT BY 값을 마이너스로 수정하여 감소시킬 값만큼 실행해야 한다.
CREATE TABLE MEMBER_seq(
NO NUMBER PRIMARY KEY, -- 기본키(시퀀스 적용할 컬럼)
NAME VARCHAR2(10) NOT NULL,
PHONENUMBER VARCHAR2(20) NOT NULL
);
시퀀스를 테이블에 적용하기 위해서는 INSERT문을 이용해서 데이터를 입력하는 곳에 "시퀀스명.NEXTVAL"를 입력한다.(시퀀스는 대부분 INSERT 문과 사용된다.
INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, 'JOKER', '01012345678');
INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, 'BATMAN', '01012340987');
INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, 'Quinn', '01010041004');
SELECT * FROM MEMBERINFO;
SELECT NO_SEQ.CURRVAL FROM DUAL;
시퀀스를 적용하여 데이터를 입력하면 자동적으로 값이 증가되면서 저장되는 것을 알 수 있다. NEXTVAL는 현재 시퀀스 값의 다음 값을 반환하고, CURRVAL는 현재 시퀀스 값을 반환한다.
ALTER SEQUENCE NO_SEQ
MAXVALUE 1000;
SELECT SEQUENCE_NAME, MAX_VALUE
FROM USER_SEQUENCES;
DROP SEQUENCE NO_SEQ;
SELECT SEQUENCE_NAME FROM USER_SEQUENCES ;
SELECT * FROM MEMBER_seq;
시퀀스를 삭제하여도 이미 입력한 데이터는 영향을 받지 않는다.