안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
SEQUENCE
- 정수 값을 순차적으로 발행하는 객체 (채번기)
- 대부분 테이블의 PK컬럼의 고유한 식별 값으로 사용
문법
create sequence 시퀀스명 → 필수
[start with 시작값(1)]
[increment by 증감값(1)]
[maxvalue 최대값 / nomaxvalue(기본값)]
[minvalue 최소값 / nominvalue(기본값)]
[cycle / nocycle(기본값)]
[cache 숫자(20) / nocache]
※ cache
- 메모리 상에서 관리될 번호 개수
- 하드웨어로부터 램이 매번 숫자를 가져오면 IO가 계속 발생되므로 한 번 가져올 때 지정된 수 (기본값은 20)만큼 가져오고, 램에서 다 소진 되면 다시 가져오게끔 하여 IO를 최소화!
- 메모리 상의 번호가 유실 되는 경우가 있지만, 대부분 PK로써 고유하기만 하면 문제 없음
※ cycle
- 최대/최소값에 도달했을 때 다시 처음부터 시작할 것인 지 결정
- nocycle 시 최대/최소값에 도달 후 이후 값부터는 채번이 안되므로 오류 발생
주의사항
① 시퀀스의 start with 값은 변경 불가
(번호 수정하고 싶다면, 시퀀스 객체를 삭제 후 재생성)
② increment by는 수정 가능
테이블 생성 및 sequence 생성
-- 테이블 생성
create table tb_member_2(
no number,
id varchar2(20) not null,
constraint pk_tb_member_2_no primary key(no),
constraint uq_tb_member_2_id unique(id)
);
-- sequence 생성
create sequence seq_tb_member_2_no
start with 1
increment by 1
nomaxvalue
nominvalue
nocycle
cache 20;
모두 기본 값으로 지정하였으므로, 사실 create sequence seq_tb_member_2_no; 만 있어도 잘 작동합니다.
☞ nextval
- 번호 가져오기
번호 가져오기 및 데이터 추가
insert into tb_member_2 values(seq_tb_member_2_no.nextval, 'honggd');
insert into tb_member_2 values(seq_tb_member_2_no.nextval, 'sinsa');
insert into tb_member_2 values(seq_tb_member_2_no.nextval, 'sejong');
insert into tb_member_2 values(seq_tb_member_2_no.nextval, 'yoogs');
insert into tb_member_2 values(seq_tb_member_2_no.nextval, 'chany');
select * from tb_member_2;
nextval을 이용하여 다음 번호를 뽑아왔으며, 유실이 일어났지만 PK로써 고유하므로 문제 되지 않습니다.
☞ currval
- sequence 객체 현재 번호 (마지막에 발급된) 조회
-- sequence 객체 현재 번호(마지막에 발급된) 조회
select
seq_tb_member_2_no.currval,
seq_tb_member_2_no.nextval
from
dual;
DD에서 조회 (user_sequences)
-- DD에서 조회
select * from user_sequences;
LAST_NUMBER는 마지막 숫자가 뭔지를 나타내는 것이 아닌,
다음에 메모리에서 번호를 또 달라고 하였을 때 21번부터 주겠다는 의미를 가진 컬럼입니다.
(다음번에 캐싱해서 가져가려면 21번부터 주겠다!)
만일 20개를 다 소진하였을 때, LAST_NUMBER를 확인해보겠습니다.
LAST_NUMBER가 41로 바뀐 것을 확인할 수 있습니다.
캐싱을 통해 20개를 더 가져왔기 때문이죠.
응용) 주문번호 생성하기
cy-20220429-1234
-- 주문번호 생성하기
-- 테이블 생성
create table cy_table(
no varchar2(30),
user_id varchar2(20),
product_id varchar2(20),
cnt number default 1,
order_date date default sysdate,
constraint pk_cy_table_no primary key(no)
);
-- sequence 객체 생성
create sequence seq_cy_table_no;
-- 데이터 추가
insert into
cy_table
values(
'cy-' || to_char(sysdate, 'yyyymmdd') || '-' || to_char(seq_cy_table_no.nextval, 'FM0000'),
'honggd', 'iphone13', 10, default
);
insert into
cy_table
values(
'cy-' || to_char(sysdate, 'yyyymmdd') || '-' || to_char(seq_cy_table_no.nextval, 'FM0000'),
'sinsa', 'imac', 5, default
);
insert into
cy_table
values(
'cy-' || to_char(sysdate, 'yyyymmdd') || '-' || to_char(seq_cy_table_no.nextval, 'FM0000'),
'chany', 'macbook', 10, default
);
-- 조회
select * from cy_table;
'DataBase > Oracle' 카테고리의 다른 글
PL/SQL) PL/SQL이란?, 익명 블럭 기초 (0) | 2022.05.02 |
---|---|
DB객체) INDEX 객체(장단점, 실행계획, 사용 시 주의점) (0) | 2022.04.29 |
DB객체) STORED VIEW 객체 (0) | 2022.04.28 |
DB객체) DATA DICTIONARY 객체 (0) | 2022.04.28 |
TCL) 트랜잭션이란? (0) | 2022.04.28 |