데이터베이스/Oracle

Sequence 시퀀스

backend dev 2024. 4. 4.

오라클에서는 자동 증가 컬럼을 사용할 수가 없다.

다른 DB에서는 컬럼 자체에 옵션이 있으나,

오라클에서는 컬럼의 값을 증가시키기 위해서는 MAX(컬럼) + 1 또는 시퀀스를 사용하여 일련번호를 부여해야 한다.

 

시퀀스 사용전 방법

1. count를 이용하는 방법 -> 에러발생

insert into board(boardid, title) VALUES ((select count(*) from BOARD)+1,'1번글');
insert into board(boardid, title) VALUES ((select count(*) from BOARD)+1,'2번글');
insert into board(boardid, title) VALUES ((select count(*) from BOARD)+1,'3번글');

 

만약 2번글을 삭제하고 

delete from board where BOARDID = 2;

 

4번글을 등록하고 싶다면 

insert into board(boardid, title) VALUES ((select count(*) from BOARD)+1,'4번글');

 

(select count(*) from BOARD)+1   의 결과값은  3이 나오게 되서 오류가 발생한다.

unique constraint (KOSA.PK_BOARD_BOARDID) violated  <- 에러발생

 

2. max를 이용

insert into board(boardid, title) VALUES ((select nvl(max(boardid),0) from BOARD)+1,'1번글');
insert into board(boardid, title) VALUES ((select nvl(max(boardid),0) from BOARD)+1,'2번글');
insert into board(boardid, title) VALUES ((select nvl(max(boardid),0) from BOARD)+1,'3번글');

 

똑같이 2번글삭제

delete from board where BOARDID = 2;

4번글 등록

insert into board(boardid, title) VALUES ((select nvl(max(boardid),0) from BOARD)+1,'4번글');

 

4번글이 잘 들어간것을 확인 가능

 

 


시퀀스(Sequence) 사용법

 CREATE  SEQUENCE  sequence_name
[INCREMENT  BY  n]
[START  WITH  n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE | NOCACHE}];

sequence_name           SEQUENCE 의 이름입니다.

INCREMENT  BY  n        정수 값인 n으로 SEQUENCE번호 사이의 간격을 지정 ( 증가값을 의미 )
                        이 절이 생략되면 SEQUENCE는 1씩 증가.

START  WITH  n          생성하기 위해 첫번째 SEQUENCE를 지정.  ( 시작값을 의미 ) 
                        이 절이 생략되면 SEQUENCE는 1로 시작.

MAXVALUE n              SEQUENCE 를 생성할 수 있는 최대 값을 지정.  ( 최댓값)

NOMAXVALUE              오름차순용 10^27 최대값과 내림차순용-1의 최소값을 지정.

MINVALUE n              최소 SEQUENCE 값을 지정. ( 최솟값)

NOMINVALUE              오름차순용 1과 내림차순용-(10^26)의 최소값을 지정.

CYCLE | NOCYCLE         최대 또는 최소값에 도달한 후에 계속 값을 생성할 지의 여부를
                        지정. NOCYCLE 이 디폴트.

CACHE | NOCACHE         얼마나 많은 값이 메모리에 오라클 서버가 미리 할당하고 유지
                        하는가를 지정. 디폴트로 오라클 서버는 20을 CACHE.

 

예시

-- 시퀀스 생성  [ 시퀀스는 자바의 static처럼 공유되는 존재이다 => 여러테이블에서 사용가능하다.]
create sequence board_num;

-- 1. 채번하기 -> 채번이란 말은 일본의 영향을 받은 단어로서 새로운 번호를 딴다는 의미
select board_num.nextval from dual; -- 실행할때마다 값이 증가한다.

-- 2 채번 확인하기 -> 가장 최근번호 (마지막번호)를 확인한다.
select board_num.currval from dual;

 

create sequence board_num; -- 시작 값은 1 즉 첫번째 nextval의 값은 1이다.

BEGIN
    for i in 1..4
    loop
        insert into BOARD(boardid, title)  values (board_num.nextval,board_num.currval||'번글');
    end loop;
end;

 

결과

 

댓글