SQL

***** 시퀀스(sequence) 짱중요 *****

에어팟맥스 2022. 7. 12. 20:30

   -- 시퀀스(sequence)란? 쉽게 생각하면 은행에서 발급해주는 대기번호표와 비슷한 것이다.
   -- 시퀀스(sequence)는 숫자로 이루어져 있으며 매번 정해진 증가치만큼 숫자가 증가된다.
  


     create sequence seq_yeyakno   -- seq_yeyakno 은 시퀀스(sequence) 이름이다.
     start with 1    -- 첫번째 출발은 1 부터 한다.
     increment by 1  -- 증가치 값    2 3 4 5 ......
     maxvalue 5      -- 최대값이 5 이다.
  -- nomaxvalue      -- 최대값이 없는 무제한. 계속 증가시키겠다는 말이다.
     minvalue 2      -- 최소값이 2 이다. cycle 이 있을때만 minvalue 에 주어진 값이 사용된다. 
                     --                nocycle 일 경우에는 minvalue 에 주어진 값이 사용되지 않는다.
                     -- minvalue 숫자 에 해당하는 숫자 값은 start with 숫자 에 해당하는 숫자 값과 같든지 
                     -- 아니면 start with 숫자 에 해당하는 숫자보다 작아야 한다.
                     
  -- nominvalue      -- 최소값이 없다.   
     cycle           -- 반복을 한다.
  -- nocycle         -- 반복이 없는 직진.
     nocache;


   create sequence seq_yeyakno_1
   start with 1          -- 첫번째 출발은 1 부터 한다.
   increment by 1        -- 증가치는 1이다. ==> 1씩 증가  2 3 4 5 ......
   maxvalue 5            -- 최대값이 5 이다.
   minvalue 2            -- 최소값이 2 이다. 
   cycle                 -- 반복을 한다.
   nocache;
   /*
   [오류 발생] ORA-04006: START WITH 에 MINVALUE 보다 작은 값은 지정할 수 없습니다
   
   minvalue 숫자 값은 start with 숫자 값과 같거나 보다 작아야 한다.
   */
   
   drop sequence seq_yeyakno_1;

시퀀스 SEQ_YEYAKNO_1 생성하기

   create sequence seq_yeyakno_1
   start with 2          -- 첫번째 출발은 2 부터 한다.
   increment by 1        -- 증가치는 1이다. ==> 1씩 증가  2 3 4 5 ......
   maxvalue 5            -- 최대값이 5 이다.
   minvalue 1            -- 최소값이 1 이다. 
   cycle                 -- 반복을 한다.
   nocache;
   -- Sequence SEQ_YEYAKNO_1이(가) 생성되었습니다.
   -- 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 ...
   -- 2(start with) 3 4 5(maxvalue) 1(minvalue) 2 3 4 5 1 2 3 4 5 1 2 3 ...

테이블 TBL_BOARD_TEST_1 생성하기

create table tbl_board_test_1
   (boardno         number
   ,subject         varchar2(100)
   ,registerdate    date default sysdate
    );
     -- Table TBL_BOARD_TEST_1이(가) 생성되었습니다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '첫번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 start 값이 2 이었다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '두번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 increment 값이 1 이었다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '세번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 increment 값이 1 이었다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '네번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 increment 값이 1 이었다.
     -- seq_yeyakno_1 시퀀스의 maxvalue 값이 5 이었고, cycle 이었다. 즉, 반복을 한다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '다섯번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 minvalue 값이 1 이었고, cycle(반복) 이었으므로
     -- maxvalue 값이 사용되어진 다음에 들어오는 시퀀스 값은 minvalue 값인 1 이 들어온다.
     
     insert into tbl_board_test_1(boardno, subject) values(seq_yeyakno_1.nextval, '여섯번째 글입니다.');
     -- 1 행 이(가) 삽입되었습니다.
     -- seq_yeyakno_1 시퀀스의 increment 값이 1 이었다.
     
     commit;

 


시퀀스 SEQ_YEYAKNO_2 생성하기

   create sequence seq_yeyakno_2
   start with 1          -- 첫번째 출발은 2 부터 한다.
   increment by 1        -- 증가치는 1이다. ==> 1씩 증가  2 3 4 5 ......
   nomaxvalue            -- 최대값이 5 이다.
   nominvalue            -- 최소값이 1 이다. 
   nocycle               -- 반복을 한다.
   nocache;
   -- Sequence SEQ_YEYAKNO_2이(가) 생성되었습니다.

테이블 TBL_BOARD_TEST_2 생성하기

   create table tbl_board_test_2
     (boardno         number
     ,subject         varchar2(100)
     ,registerdate    date default sysdate
     );
     -- Table TBL_BOARD_TEST_2이(가) 생성되었습니다.
     
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '첫번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '두번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '세번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '네번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '다섯번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '여섯번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '일곱번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '여덟번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '아홉번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '열번째 글입니다.');
     insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '열한번째 글입니다.');
     
     commit;
   
     select *
     from tbl_board_test_2;

 

생성된 시퀀스(sequence) 정보를 조회하기

   select *
   from user_sequences;

 

시퀀스에서 마지막으로 사용된 값 알아내기

   ----- ***** 시퀀스 SEQ_YEYAKNO_1 이 마지막으로 사용된 값을 알고자 한다. ***** -----
   select SEQ_YEYAKNO_1.currval
   from dual; -- 2
   
   ----- ***** 시퀀스 SEQ_YEYAKNO_2 이 마지막으로 사용된 값을 알고자 한다. ***** -----
   select SEQ_YEYAKNO_2.currval
   from dual; -- 11

 

 

시퀀스에서 다음에 들어올 값을 조회하기

   -- [틀린 풀이]
   select SEQ_YEYAKNO_2.nextval
   from dual; -- 12
   
   select SEQ_YEYAKNO_2.nextval
   from dual; -- 13
   
   -- nextval 은 시퀀스 SEQ_YEYAKNO_2 의 값을 써버리는 것이다.
   
   insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '서교밥집(5500원)');
   -- 14	서교밥집(5500원)	22/07/12
   commit;
   
   select *
   from tbl_board_test_2;
   -- [올바른 풀이]
   
   select last_number
   from user_sequences
   where sequence_name = 'SEQ_YEYAKNO_2';
   -- 15
   
   insert into tbl_board_test_2(boardno, subject) values(seq_yeyakno_2.nextval, '강아지와 친해요');
   
   commit;
   
   select *
   from tbl_board_test_2;

 

시퀀스 삭제하기

   ----- ***** 시퀀스 SEQ_YEYAKNO_1 삭제하기 ***** -----
   drop sequence SEQ_YEYAKNO_1;
   -- Sequence SEQ_YEYAKNO_1이(가) 삭제되었습니다.