ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] SEQUENCE 시퀀스
    Database/SQL (oracle, mysql) 2019. 5. 31. 15:41

    [SQL] SEQUENCE 시퀀스

     

     - 자동번호 부여
     - 숫자값이 일정한 규칙에 의해서 연속적으로 자동증가.
     - 테이블에 종속적이지 않다(테이블과 독립적)
    형식)
      CREATE SEQUENCE sequence_name  
                      [INCREMENT BY] 증가치
                      [START WITH] 초기값
                      [MAXVALUE n|NOMAXVALUE]
                      [MINVALUE|NOMINVALUE]
                      [CYCLE|NOCYCLE]
                      [CACHE|NOCACHE];
      maxvalue: 시퀀스가 가질 수 있는 최대값 지정.   
                nomaxvalue일 경우 ascending순서일 경우 10의 27승 
                                  descending일 경우 -1           
      minvalue: 시퀀스가 가질 수 있는 최대값 지정.               
                nominvalue일 경우 ascending 1
                                  descending 10의 26승으로 설정.
      cache: 메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본값은 20.
             nocache는 메모리 상에서 시퀀스를 관리하지 않음.    

    사용법)

       시퀀스명.nextval -> 발생된 번호값(그다음)

       시퀀스명.currval -> 현재 번호값

     

    create sequence test_seq;    -- 기본 1부터 시작해서 1씩 증가되는 숫자값
    ---> 시퀀스 생성

    drop sequence test_seq;
    create sequence test_seq
                 start with 1
                 increment by 1
                 nocycle
                 nocache;
    ---> 시퀀스 생성

    - 현재 숫자 보기(조회)
      select test_seq.currval
      from dual;

    ORA-08002: sequence TEST_SEQ.CURRVAL is not yet defined in this session

    - 자동 번호(숫자) 얻어오기
      select test_seq.nextval from dual;    
      select test_seq.nextval from dual;    
      select test_seq.nextval from dual;    
      select test_seq.nextval from dual;    
      select test_seq.nextval from dual;
      ---> 5    
        
    - 현재 숫자 보기(조회)
      select test_seq.currval
      from dual;

       CURRVAL
    ----------
             5    

    테이블에 적용한 사례)
       alter table dept3
       drop primary key cascade;

       
       drop table dept3;
       create table dept3
       as select * from dept
          where 1=0;   
        
       <dept3테이블 deptno에 primary key설정>
       alter table dept3
       add constraint dept3_pk primary key (deptno);
        
       <행 데이터 입력>
       insert into dept3 values (10, '영업부', '서초');
       insert into dept3 values (20, '자재부', '대전');
       insert into dept3 values (30, '개발부', '남터');
        
       select * from dept3;

        DEPTNO DNAME                        LOC
    ---------- ---------------------------- --------------------------
            10 영업부                                             서초
            20 자재부                                             대전
            30 개발부                                             남터
            

    ~~~~ 오랜 시간이 흘러 새로운 부서의 정보를 입력할 때 ~~~~~~~~~~~~~~~~~~~~~~~~

       데이터    ===> '기획부'             '강남'
      insert into dept3 values ( ) 
       
       

      insert into dept3 (dname, loc) values ('기획부', '강남');
      ---> ORA-01400: cannot insert NULL into ("SCOTT"."DEPT3"."DEPTNO")

      insert into dept3 (deptno, dname, loc) values (30, '기획부', '강남');
      ---> ORA-00001: unique constraint (SCOTT.DEPT3_PK) violated
            
      
      ##성공적인 입력을 위하여~~
      select max(deptno) from dept3;
      ---> 30번 부서
      
      select deptno from dept3;
        DEPTNO
    ----------
            10
            20
            30


      insert into dept3 (deptno, dname, loc) values (40, '기획부', '강남');

    =========================== 시퀀스 객체를 사용했다면 =============================
        문제) dept3부서테이블의 전체 데이터를 삭제하시오!!
            
            delete from dept3;
            truncate table dept3;
        
        문제) dept3테이블내의 deptno에 적용할 시퀀스 객체를 생성하시오.
                     (10부터 시작해서 10씩 증가)
                     
            create sequence dept3_seq
                        start with 10
                        increment by 10
                        nocycle
                        nocache;
                                   
         ※시퀀스 적용된 부서번호 생성!!
       <행 데이터 입력>
       insert into dept3 values (dept3_seq.nextval , '영업부', '서초');
       insert into dept3 values (dept3_seq.nextval , '자재부', '대전');
       insert into dept3 values (dept3_seq.nextval , '개발부', '남터');
         
    SQL> select * from dept3;

        DEPTNO DNAME                        LOC
    ---------- ---------------------------- --------------------------
            10 영업부                                            서초
            20 자재부                                            대전
            30 개발부                                            남터     
         

    ~~~ 오랜 시간이 흘러 새로운 부서의 정보를 입력할 때 ~~~~~~~~~~~~~~~~~~~~~~~~

       데이터    ===> '기획부'             '강남'
      insert into dept3 values (dept3_seq.nextval ) 

     

    반응형

    'Database > SQL (oracle, mysql)' 카테고리의 다른 글

    [ SQL ] 패키지 선언  (0) 2019.06.04
    [SQL] PL/ SQL  (0) 2019.05.31
    [SQL] VIEW 란?  (0) 2019.05.31
    [SQL] 참조 CASCADE관한 설명  (0) 2019.05.30
    [SQL] 무결성 제약조건  (0) 2019.05.30

    댓글

Designed by Tistory.