오라클에서는 자동 증가 컬럼을 사용할 수가 없다. 다른 DB에서는 컬럼 자체에 옵션이 있으나, 오라클에서는 컬럼의 값을 증가시키기 위해서는 MAX(컬럼) + 1 또는 시퀀스를 사용하여 일련번호를 부여해야 한다.
- 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씩 증가한다.
CACHE를 사용할 경우 CACHE 또는 CACHE "값"으로 지정할 수가 있다. 값을 지정하지 않으면 기본값은 20이다. 지정한 값만큼 시퀀스를 미리 생성해 놓는다.
CACHE
또는
CACHE 100
감소 시퀀스
CREATE SEQUENCE emp_seq
INCREMENT BY -1
START WITH 1000
MINVALUE 1
MAXVALUE 1000
NOCYCLE
NOCACHE
NOORDER;
위의 시퀀스는 1000부터 시작하여 1까지 1씩 감소한다.
시퀀스 사용
SELECT emp_seq.NEXTVAL
FROM dual
시퀀스명.NEXTVAL을 사용하여 일련번호를 생성할 수 있다.
시퀀스를 실행할 때마다 값이 증가하니 주의해야 한다. (증가된 값을 다시 내릴 수 없다)
INSERT INTO emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (emp_seq.NEXTVAL
, 'TIGER'
, 'ANALYST'
, 7566
, TRUNC(SYSDATE)
, 3000
, NULL
, 20)
INSERT 문에서 순번을 매길 때 유용하게 사용할 수 있다.
SELECT emp_seq.CURRVAL
FROM dual
시퀀스명.CURRVAL을 사용하여 현재 시퀀스 순번을 가져올 수 있다.
CURRVAL은 여러번 실행해도 순번은 증가하지 않고, 현재 순번만 가져온다.
CURRVAL은 NEXTVAL을 한번 실행한 세션에서만 사용 가능하다. 위의 쿼리만 사용 시 에러가 발생할 수 있다.
(ORA-08002 : emp_seq.CURRVAL은 이 세션에서는 정의 되어있지않습니다)
SELECT emp_seq.NEXTVAL
, emp_seq.CURRVAL
FROM dual
INSERT, SELECT 등 쿼리문에 사용 시 NEXTVAL과 함께 사용해야한다. PROCEDURE, FUNCTION에서 사용할 경우 내부에서는 한 세션이기 때문에 쿼리문이 같지 않아도 오류가 발생하지 않는다.
시퀀스 수정
ALTER SEQUENCE emp_seq INCREMENT BY 2
시퀀스 증가값을 1 → 2로 변경
ALTER SEQUENCE emp_seq MAXVALUE 99999
시퀀스 최댓값을 9999 → 99999 변경
※ START WITH (변경불가) 외에는 모두 변경이 가능하다.
시퀀스 삭제
DROP SEQUENCE emp_seq
시퀀스 값을 초기화 하기 위해서는 시퀀스를 삭제 후 다시 생성하거나, INCREMENT BY 값을 마이너스로 수정하여 감소시킬 값만큼 실행하면 된다. 그러나 운영중인 시스템에서는 주의해야 한다.