본문 바로가기

자바 웹 개발자가 될거야/DB

[Oracle] Sequence 생성 및 사용하기

< Sequence >

 

- 자동으로 고유한 번호를 반환해 주는 번호생성기와 같은 Object

- 어느 테이블이든 사용가능하지만 한 테이블에서 사용하는게 좋음 ( 값이 새로 시작하는게 아님 )

  · A 테이블에서 5번 쓰고 B 테이블에서 3번 쓴 후 다시 A 테이블에 쓰면 공백이 생김

- 신입사원이 들어올때마다 시퀀스가 기억하고 자동으로 번호를 제공할 수 있음

 

 

① 시퀀스 생성

 

- INCREMENT BY n

  · 시퀀스 번호 사이 n 만큼 간격을 지정 ( 음수도 가능 )

  · default = 1

 

- START WITH n

  · 시퀀스 번호의 시작값을 n으로 지정

  · default = 1

 

- MAXVALUE/MINVALUE n

  · 시퀀스의 최대값, 최소값 지정

  · default : NOMAXVALUE/NOMINVALUE   · 생략시 시스템에 정의되어있는 최대값(10^27), 최소값(-10^26) 사용

 

- CYCLE

  · 최대값/최소값에 도달하면 처음부터 다시 순환

  · 별로 권장하지 않음 ! (주로 PK 컬럼에 많이 쓰기때문에)

  · default : NOCYCLE (최대/최소값에 도달하면 더이상 값을 반환하지 않음)

 

- CACHE n

  · 시퀀스 값을 미리 n만큼 할당받음

  · 캐시 옵션 쓰면 속도가 빨라짐

  · default : CACHE 20

 

CREATE SEQUENCE 시퀀스명
	[INCREMENT BY n]
	[START WITH n]
	[{MAXVALUE n | NOMAXVALUE}]
	[{MINVALUE n | NOMINVALUE}]
	[{CACHE n | NOCACHE}];

 

- 옵션의 순서는 상관없음

 

CREATE SEQUENCE dept_id_seq
	INCREMENT BY 10
	START WITH 180
	MAXVALUE 1000;

  · 부서 테이블에 부서가 신설되면 180부터 시작돼서 10씩 증가되는 부서번호 부여 

  · 현재 부서 테이블에 MAX(department_id)가 170이여야함

 

 

 

② 시퀀스 사용

 

- 시퀀스명.NEXTVAL

  · 사용가능한 다음 시퀀스값 반환

 

INSERT INTO 테이블명
VALUES (시퀀스명.NEXTVAL, 값1, 값2, ...);

 

INSERT INTO departments
VALUES (dept_id_seq.NEXTVAL, 'HHHH', 107, 1700);

 

 

 

 

- 시퀀스명.CURRVAL

  · 현재 시퀀스 값, 즉 마지막 시퀀스값 반환

  · 주로 몇번까지 썼는지 확인하기 위해 사용

 

SELECT 시퀀스명.CURRVAL
FROM dual;

 

SELECT dept_id_seq.CURRVAL
FROM dual;

 

③ 시퀀스 수정

 

- 시퀀스값의 간격, 최대값/최소값, CYCLE 여부 수정가능하다

- 단, 시작값은 수정 불가 !

 

ALTER SEQUENCE 시퀀스명
	[변경하고자 하는 옵션];

 

 

④ 시퀀스 삭제

 

- 데이터는 그대로 남음

 

DROP SEQUENCE 시퀀스명;