본문 바로가기
DataBase/ORACLE

[Oracle] 시퀀스값 일괄 증가, Sequence NEXTVAL 반복 수행

by ojava 2023. 7. 6.
반응형

자주 쓰는 쿼리인데 매번 까먹어서 박제해놓고
나중에 내가 찾아보려고 간만에 블로그 글 작성

최근에 DB 데이터를 엎었는데
RAW 데이터만 엎어주고 SEQ 값 일치등의 Object 값 조정은 안해줘서 종종 아래와 같은 에러가 발생함

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (테이블 PK명) violated

해당 오류 해결을 위한 방법 두 가지를 소개한다



방식1. Alter 기능을 통한 Sequence 값 조정

-- alter 권한이 있는 경우 사용 가능
ALTER SEQUENCE 시퀀스명
INCREMENT BY 증가되길 원하는 수;

SELECT 시퀀스명.NEXTVAL
FROM     DUAL;

ALTER SEQUENCE 시퀀스명
INCREMENT BY 1;

일단 이 방식은 내가 alter 권한이 있어야 사용가능
하지만 DBA가 별도로 있다면 대부분 권한 제한을 많이 두므로 DDL문 권한이 없어서 해당 기능을 사용하기 어려울 수 있음


해당 쿼리는 한 세트로 구성된다.

  • ALTER 쿼리로 시퀀스 증가 폭을 원하는 만큼으로 늘림
  • NEXTVAL로 시퀀스를 증가시키게 되면 원하는 만큼으로 증가됨
  • 다시 ALTER 쿼리를 통해 시퀀스 증가 폭을 기존대로 1씩 늘어나도록 세팅하는 내용


혹시 INCREMENT가 1이 아니라면 기존 값에 맞춰서 바꿔주면 되니 변경 전에 기존 설정을 반드시 참고하시길!



방식2. NEXTVAL를 이용한 쿼리 반복 수행을 통한 일괄 증가

-- 증가를 원하는 SEQ와 반복 횟수를 지정
SELECT 시퀀스명.NEXTVAL
FROM     DUAL
CONNECT BY LEVEL <= 증가되길 원하는 수

해당 쿼리는 ALTER문을 사용할 수 없을 때 쓰면 좋을 대체제다. 우리는 SELECT는 자유롭게 할 수 있으니까!

1씩 증가되는 시퀀스 증가문을 여러번 반복 수행해서 원하는 만큼으로 맞추는 쿼리다.



예를 들어 USER 테이블과 이 테이블의 키값인 USER_ID에 들어갈 SEQ_USER라는 시퀀스를 사용하고 있다고 했을 때, 데이터만 따로 부어서 실제 데이터와 시퀀스 값에 차이가 있다고 가정한다.


USER_ID의 가장 큰 값이 36500이고
SEQ_USER의 현재 값이 36000이라고 했을 때
500만큼의 값 차이가 발생하여 INSERT 문 수행 시 NEXTVAL를 통해 값을 증가시켜서 USER_ID값을 채번하려고 해도 이미 존재하는 SEQ라고 뜨면서 오류가 발생한다.


SELECT SEQ_USER.NEXTVAL
FROM     DUAL
CONNECT BY LEVEL <= 500

이런식으로 시퀀스의 값을 강제로 500번 수행시켜서 내가 원하는 값으로 시퀀스 현재값을 맞춰준 다음에 기존 로직을 수행하면 문제없이 수행되는 것을 볼 수 있다.




또 미래의 내가 볼 글 열심히 적어놨다,,,
오늘도 다들 적게 삽질하고 빨리 개발하고 퇴근합시다!

반응형