Jam's story

[Oracle ] days14- 시퀀스 본문

Oracle

[Oracle ] days14- 시퀀스

애플쩀 2022. 4. 21. 15:06
시퀀스 

시퀀스란 기존의 테이블에 대해 기본키나 유니크 키를 사용하여 부가하는 일종의 새로운 컬럼처럼 사용할 수 있는

일련번호를 매김하기 위한 하나의 컬럼으로 구성된 테이블과 같다.
• 시퀀스라는 객체 스스로만 사용할 의미가 없으며, 기존의 테이블과 연계해서 사용하게 된다

 

시퀀스의 특징

• 유일한 연속번호를 자동으로 생성
• 기본키값 생성을 위해 사용
• Application Code를 대채
• 메모리에 Cache되어 access 효율성을 증가
• 시퀀스는 여러 테이블에 의해 공유될 수 있다.

【형식】
CREATE SEQUENCE 시퀀스명
[ INCREMENT BY 정수]
[ START WITH 정수]
[ MAXVALUE n ¦ NOMAXVALUE]
[ MINVALUE n ¦ NOMINVALUE]
[ CYCLE ¦ NOCYCLE]
[ CACHE n ¦ NOCACHE];


옵션 설명 
INCREMENT BY 정수 시퀀스 번호를 정수만큼씩 증가(디폴트=1) 
START WITH 정수 시작값을 지정(디폴트=1) cycle 옵션을 사용한 경우 다시 값을 생성할 때 minvalue에 설정한 값부터 시작 
MAXVALUE 정수 증가할 수 있는 최대값 
NOMAXVALUE(default) 시퀀스의 최대값이 없음을 정의, 오름차순은 10^27까지 커질 수 있고, 내림차순으로 1까지 작아질 수 있음 
MINVALUE 정수 생성할 수 있는 최소값 
NOMINVALUE(default) 시퀀스의 최소값이 없음을 정의, 오름차순은 최소 1까지, 내림차순으로 -(10^26)까지 간다. 
CYCLE 최대 또는 최소값에 도달한 후 값을 다시 생성 
NOCYCLE(default) 최대 또는 최소값에 도달한 후 값을 다시 재시작할 수 없음 
CACHE 빠른 access를 위해 시퀀스의 값을 메모리에 저장(기본 20) 
NOCACHE 어떤 시퀀스값도 캐싱되지 않음 

 

CURRVAL이 참조되기 전에 NEXTVAL이 먼저 사용되어야 한다.
이는 pseudo 컬럼의 CURRVAL의 값은 NEXTVAL 컬럼 값을 참조하기 때문이다.
그러므로 NEXTVAL 컬럼이 사용되지 않은 상태에서 CURRVAL을 사용하면 아무런 값이 없기 때문에 error를 출력한다.
NEXTVAL 시퀀스명.NEXTVAL 새로 작성된 시퀀스의 다음 값을 반환
CURRVAL 시퀀스명.CURRVAL 새로 작성된 시퀀스의 현재 값을 반환
create sequence seq01
    increment by 1 -- 증가치 1씩 증가 
    start with 100 --번호표 1시작
    maxvalue 10000
    minvalue 1 -- 100부터 시작해서 10000까지 간담에 다시 1부터 시작 , 
    --다음 사이클 시작은 1로 하지만, 처음 시작은 100으로 하겠다 
    cycle   ---max값까지 오게 되면 다시 1부터 시작 
    --nocycle
    cache 20; --빠른 access를 위해 시퀀스의 값을 메모리에 저장(기본 20) 
    --성능때문에 ,미리 번호표를 빼놓는 갯수 
    
create sequence seq02;  --옵션을 안줘도 생성이 됨 

--시퀀스를 확인 
select *
from user_sequences;

 

시퀀스 삭제 
drop sequence seq01;
drop sequence seq02;

 

기존의 다른테이블에 사용
select *
from dept;
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON

create sequence seq_dept
    increment by 10
    start with 50
    maxvalue 90 --데이터 자체가 2자리라 90이 마지막
    nocycle
    nocache; 

insert into dept(deptno, dname, loc) values(seq_dept.nextval,'d','seoul');
insert into dept(deptno, dname, loc) values(seq_dept.nextval,'d','seoul' || seq_dept.currval);
 --50~70 도 넣어졌는데 렉걸려서 그부분은 없어짐 (다시작성) 
80	d	seoul
90	d	seoul90

--현재 순서를 볼 수 있는 currval 
--nextval 로 한번 번호표를 뽑아놔야 그 다음부터 사용할 수 있음 
select seq_dept.currval
from dual;

delete from dept 
where deptno=90;

 

'Oracle' 카테고리의 다른 글

[Oracle] days 15- 설문조사 쿼리 데이터 넣어보기  (0) 2022.04.22
[Oracle] days14 - pl/sql  (0) 2022.04.21
[Oracle]days 14 -뷰  (0) 2022.04.21
[Oracle] days14- 조인문제  (0) 2022.04.21
[Oracle] days14- 정규화  (0) 2022.04.21
Comments