[SQL] 중복되지 않은 번호 생성 - SEQUENCE

·2025년 7월 15일

SQL

목록 보기
113/126

💡 오라클의 객체 5가지

  1. table
  2. view
  3. index
  4. sequence: 쿠팡의 주문번호처럼 중복되지 않는 유니크한 값을 생성하는 객체
  5. synonym

문제1. seq1 이라는 이름으로 시퀀스를 생성하시오

create sequence seq1
start with 1	-- 시작 숫자
increment by 1	-- 증가치
maxvalue 100	-- 최댓값
minvalue -1		-- 최솟값
nocycle			-- 순환여부
cache 20;		-- 메모리에 미리 올려놓을 번호의 갯수

100을 초과하니 에러발생
: 시퀀스 SEQ1.NEXTVAL exceeds MAXVALUE은 사례로 될 수 없습니다

-- 한번 실행할 때마다 1씩 증가
select seq1.nextval
 from dual;

sequece의 maxvalue 수정

alter sequence seq1
maxvalue 200;

문제2. 쿠팡 주문 테이블을 다음과 같이 생성하시오

create table cuppang_order
( order_id number(10),
  prod_name varchar2(50),
  prod_cnt number(10) );
  
create sequence cuppang_seq
start with 1
increment by 1
maxvalue 1000000	-- minvalue 따로 안쓰면 기본값으로 설정됨
nocycle
cache 20;

-- 번호가 중복되지 않고 순서대로 들어감
insert into cuppang_order
values(cuppang_seq.nextval, '서울우유', 2);

insert into cuppang_order
values(cuppang_seq.nextval, '아이폰', 1);

insert into cuppang_order
values(cuppang_seq.nextval, '블루베리', 1);

select * from cuppang_order;

📌
insert into 테이블명
values(시퀀스명.nextval, ..., ...);


문제3. 배달의 민족 주문 테이블을 bae_order 라고 만들고 위의 쿠팡 테이블과 똑같이 컬럼들을 구성하고 시퀀스도 만들고 데이터를 입력해서 시퀀스가 정상적으로 사용되는지 확인하시오

create table bae_order
( order_id number(10),
  prod_name varchar2(50),
  prod_cnt number(10) );
  
create sequence bae_seq
start with 1
increment by 1
maxvalue 1000000
nocycle
cache 20;

insert into bae_order
values(bae_seq.nextval, '떡볶이', 3);

insert into bae_order
values(bae_seq.nextval, '치킨', 2);

insert into bae_order
values(bae_seq.nextval, '마라탕', 1);

insert into bae_order
values(bae_seq.nextval, '피자', 4);

select * from bae_order;

문제4. 지금 방금 만든 bae_seq 의 시퀀스의 파라미터(속성) 를 다음과 같이 수정하시오

alter  sequence  bae_seq
increment by 2
maxvalue 10000000
cycle
cache 30;


select *
 from user_sequences;

💡 start with는 변경할 수 X
dba에게 중요한 속성은 cache 사이즈
동시에 insert 하는 세션들이 몰려올 때 입력 성능이 느려지지 않게하려면 cache 사이즈를 늘려야 함


문제5. 위에서 만든 cuppang_seq 시퀀스의 cache 사이즈를 100으로 늘리시오

시퀀스 조회

select *
 from user_sequences;
 
alter sequence cuppang_seq
cache 100;

문제6. 그동안 만든 시퀀스를 삭제하시오

select *
 from user_sequences;
 
select 'drop sequence ' || lower(sequence_name) || ';'
 from user_sequences;
 
drop sequence bae_seq;
drop sequence cuppang_seq;
drop sequence seq1;

OCP 문제 NO.67

질문: ORD_ITEMS 테이블과 ORD_SEQ 시퀀스에 대해 올바른 설명 두 가지는? (두 개 선택)


A. 시퀀스 ORD_SEQ가 삭제되면, ORD_ITEMS 테이블의 ORD_NO 컬럼의 기본값은 NULL이 됩니다.

B. ORD_ITEMS 테이블에 데이터를 삽입하려는 사용자는 시퀀스 ORD_SEQ에 접근할 수 있는 권한이 있어야 합니다.

C. ORD_NO 컬럼은 ORD_SEQ 시퀀스로부터 다음 번호를 자동으로 받아옵니다 (ORD_NO에 값을 명시하지 않으면).

D. ORD_SEQ 시퀀스는 5000개 숫자를 생성한 후 1로 되돌아갑니다. 그리고 최대 20번까지 순환할 수 있습니다.

E. ORD_SEQ 시퀀스는 중복 숫자가 발생하지 않도록 보장합니다.


정답:

B: 시퀀스를 사용하려면 권한이 필요합니다.

C: DEFAULT ord_seq.NEXTVAL이기 때문에, 값을 명시하지 않으면 자동으로 시퀀스에서 값을 받아옵니다.


오답 설명:

  • A: 시퀀스를 삭제하면 기본값에서 참조가 사라지므로 오류 발생하지만 NULL이 되는 건 아닙니다.
  • D: CACHE 5000은 성능을 위한 값이고, CYCLE만 설정되어 있을 뿐 5000개마다 순환한다는 건 사실이 아닙니다.
  • E: CYCLE 옵션 때문에 중복 숫자가 발생할 수 있음 (MAXVALUE 도달 후 다시 1부터 시작)

0개의 댓글