시퀀스 "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 부터 센스 있게 만들어 줬어야 되는거 아닌가??
'ORACLE > DBA' 카테고리의 다른 글
Toad ArraySize 조정 방법 (0) | 2024.04.24 |
---|---|
PK 컬럼을 포함하는 일반 인덱스를 만들어도 될까? (0) | 2024.04.16 |
SQL Cursor Flush 방법 (0) | 2024.04.11 |
파티션 테이블에 Unique 고찰 (0) | 2024.04.08 |
문제로 풀어보는 Partitioned Index (0) | 2024.04.06 |