본문 바로가기
DataBase/Oracle

DB객체) SEQUENCE 객체 (nextval, currval)

by 박채니 2022. 4. 29.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


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;