오라클에서는 자동 증가 컬럼을 사용할 수가 없다.
다른 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번글');
시퀀스(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;
'데이터베이스 > Oracle' 카테고리의 다른 글
트리거 Trigger (0) | 2024.04.09 |
---|---|
view (뷰) (0) | 2024.04.04 |
가상컬럼 (0) | 2024.04.03 |
oracle 테이블 복사 및 구조 복사 , PL-SQL(반복문) (0) | 2024.04.03 |
서브쿼리 (subQuery) [스칼라,인라인 뷰,중첩] // all any some 연산자 (0) | 2024.04.02 |
댓글