시퀀스 초기화 방법

시퀀스 "1" 초기화 방법은 18C 이전에는 매우 번롭고, 깔끔하지 못했다.

왜냐하면, 재생성을 하지 않고는, 조정 후 시퀀스를 사용하게 되면 면 2로 시작되기 때문이었다.

18C 부터는 간단한 명령문으로 시퀀스를 초기화 하고, 1 부터 사용 할 수 있게 되었다.

아래 문법 및 테스트를 참고하세요.

[ 문법 ]

ALTER SEQUENCE TB_SSQ_TEST_SQ1 RESTART START WITH "원하는 시작 번호";
 

 

[ 18C 부터 시퀀스 초기화 ]

1. 신규 생성
  CREATE SEQUENCE TB_SSQ_TEST_SQ1 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE;

2. 시퀀스 현재값 10으로 변경 위해 10번 사용 
  SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM DUAL ;  -- 10 회 Call
  SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; --  확인 : 10 

3. 시퀀스 초기화 수행
  ALTER SEQUENCE TB_SSQ_TEST_SQ1 RESTART START WITH 1;

4. 시퀀스 호출
   SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM DUAL ; -- 1 부터 다시 조회됨 
※ 참고 : 초기화 후 SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; -- 10 이 출력

 

[ 18C 이전 시퀀스 초기화 ]

1) 시퀀스 생성 > 현재 값 조회

1. 신규 생성
  CREATE SEQUENCE TB_SSQ_TEST_SQ1 START WITH 1 INCREMENT BY 1 CACHE 100 NOCYCLE;

2. 시퀀스 조정 후 차이점을 알기 위해 현재 값 호출 ( 18 부터도 동일함 ) 
 :  ORA-08002: 시퀀스 TB_SSQ_TEST_SQ1.CURRVAL은 이세션에서는 정의되어 있지 않습니다. 
   SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; 

3. 시퀀스 호출 후 현재 값 조회
  SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM DUAL ; -- 1 조회 
  SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; -- 1 조회

2) 시퀀스 조정 후 > 현재값 조회

1) 시퀀스 현재값 10으로 변경 위해 10번 사용 
  SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM DUAL ;  -- 10 회 Call
  SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; --  확인 : 10

2. "1" 초기화 위해 INCREMENT BY 이용
 2.1) INCREMENT BY "-10" 설정 후 수행
      ALTER SEQUENCE TB_SSQ_TEST_SQ1 INCREMENT BY -10;
      SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM dual; -- 에러 발생
     [ Error ]  ORA-08004 : 시퀀스 TB_SSQ_TEST_SQ1.NEXTVAL gose below minvalue은 사례로 될수 없습니다. 
     이유는 아래 쿼리 조회시 min_value 값 : 1 이기 때문에 0으로 변경 못하는 것임.
     select SEQUENCE_NAME, MIN_VALUE from user_sequences where SEQUENCE_NAME = 'TB_SSQ_TEST_SQ1'; 

 2.2) INCREMENT BY "-9" 설정 후 수행
      ALTER SEQUENCE TB_SSQ_TEST_SQ1 INCREMENT BY -9;
      SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM dual; -- 1회 수행 
      SELECT TB_SSQ_TEST_SQ1.CURRVAL FROM DUAL ; -- 1 출력

     정상적인 시퀀스 사용을 위해 INCREMENT BY "1"로 변경
     ALTER SEQUENCE TB_SSQ_TEST_SQ1 INCREMENT BY 1;
     이후 어플리케이션에서 수행 
     SELECT TB_SSQ_TEST_SQ1.NEXTVAL FROM dual; -- 2로 조회됨 
     "2"로 되는 이유는 시퀀스 신규 생성시는 현재 값이 없지만, INCREMENT BY로 조정 후 현재값이 1이기 때문임 

     18c에 초기화 기능으로 이제는 시퀀스 초기화 작업에 찝찝함이 모두 사라졌다. 
     이런 건 Oracle이 10g 부터 센스 있게 만들어 줬어야 되는거 아닌가??