oracle
데이터베이스 객체 _시퀀스 (생성)
꽃솜이
2021. 4. 1. 22:31
시퀀스(Sequence)는 자동 순번을 반환하는 데이터베이스 객체다.
예를 들어, 현재 사원 테이블의 사번(employee_id) 값은 100부터 206까지 인데 숫자형으로 되어 있다.
만약 신입사원이 들어온다면 206 다음인 207번으로 생성될 것이다.
그런데 207이란 숫자를 얻으려면 기존 사원번호 중 최댓값을 구해 1을 더해야 하고,
이 로직을 어딘가에 심어놔야 하는데,
특정한 로직을 통해 사번을 추출하는 것이 아니라
단순히 증감 연산을 이용해 유일한 숫자를 구할 때는 시퀀스를 사용하면 매우 편리하다.
CREATE SEQUENCE [스키마명.]시퀀스명
INCREMENT BY 증감숫자
START WITH 시작숫자
NOMINVALUE | MINVALUE 최솟값
NOMAXVALUE | MAXVALUE 최댓값
NOCYCLE | CYCLE
NOCACHE | CACHE;
- INCREMENT BY 증감숫자: 증감숫자는 0이 아닌 정수. 양수이면 증가, 음수이면 감소. 디폴트 값은 1
- START WITH 시작숫자: 시작숫자의 디폴트 값은 증가일 때는 MINVALUE, 감소일 경우 MAXVALUE.
- NOMINVALUE: 디폴트 값으로 증가일 때 1, 감소의 경우 -(1027 -1).
- MINVALUE 최솟값: 최솟값은 시작숫자와 작거나 같아야 하고 MANVALUE보다 작아야 한다.
- NOMAXVALUE: 디폴트 값으로 증가일 때 1028-1, 감소의 경우 -1.
- MAXVALUE 최댓값: 최댓값은 시작숫자와 같거나 커야 하고 MINVALUE보다 커야 한다.
- NOCYCLE: 디폴트 값으로 최대나 최솟값에 도달하면 생성 중지.
- CYCLE: 증가는 최댓값에 도달하면 다시 최솟값부터 시작, 감소는 최솟값에 도달하면 다시 최댓값에서 시작.
- NOCACHE: 디폴트로 메모리에 시퀀스 값을 미리 할당해 놓지 않으며 디폴트 값은 20.
- CACHE: 메모리에 시퀀스 값을 미리 할당해 놓음.
CREATE SEQUENCE my_seq1
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 1000
NOCYCLE
NOCACHE;
결과
sequence MY_SEQ1이(가) 생성되었습니다.
이 시퀀스는 1부터 시작해 1씩 증가하며 최솟값 1부터 최댓값 1000까지 순번을 자동 생성한다.
그럼 이 시퀀스로 ex2_8테이블의 col1 컬럼에 값을 입력해 보자.
DELETE ex2_8; -- 기존 데이터를 지운다.
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);
결과
1개 행 이(가) 삽입되었습니다.
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);
결과
1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;
결과
COL1 COL2
---------- ----------
1
2
INSERT를 두 번 실행했으므로 col1 컬럼에 1, 2 값이 순차적으로 들어 갔다.
시퀀스명.NEXTVAL을 사용하면 해당 시퀀스에서 다음 순번 값을 자동으로 가져온다.
또한 시퀀스명.CURRVAL을 사용하면 해당 시퀀스의 현재 값을 알 수 있다.
SELECT my_seq1.CURRVAL
FROM DUAL;
결과
CURRVAL
----------
2
다시 한번 NEXTVAL로 값을 가져오면 3이 입력될 것이다.
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);
결과
1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;
결과
COL1 COL2
---------- ----------
1
2
3
주의할 사항은 NEXTVAL을 사용하면 값이 계속 증가된다는 점이다.
즉 INSERT문이 아닌 SELECT문에서 사용하더라도 값이 증가된다.
SELECT my_seq1.NEXTVAL
FROM DUAL;
결과
NEXTVAL
----------
4
INSERT INTO ex2_8 (col1) VALUES ( my_seq1.NEXTVAL);
결과
1개 행 이(가) 삽입되었습니다.
SELECT * FROM ex2_8;
결과
COL1 COL2
---------- ----------
1
2
3
5