[Oracle] 데이터의 유일성, 챙겼나요

지영·2024년 1월 8일
0

백엔드개발자

목록 보기
8/11


이전에 재직했던 곳에서는 RDBMS를 오라클로 모두 쓰고 있다. 개인적으로 플젝을 할때나, 팀프로젝트에서는 한번도 안써봤던 거지만, MySQL이나 오라클이나 거의 같은 뿌리를 가지고 있어서 사소한 문법 말고는 비슷하다. (하지만 성능은 역시 오라클이...👍크으)

문제는 소규모로 프로젝트를 하거나 할 때는 못 겪어본 오류메시지가 너무 많아서 나를위해 정리할 겸 끄적여볼 것 이다.

먼저 쓰고 있는 스킬셋은 다음과 같다. (여기서는 그닥 중요하지 않다)

로컬 개발기 스킬셋

  • 개발언어 : java(1.8)
  • 빌드도구 : maven
  • 의존성관리 : Nexus
  • 개발 IDE : Eclipse
  • was : Embbed Tomcat
  • 형상관리 : SVN
  • 주요 LIB : Spring, Springboot
  • DBMS : Oracle
  • Mapper : Mybatis
  • 디자인패턴 : Singleton
  • 로그 : Logback(debug만 허용)
  • 트랜잭션 단위 : @ServiceId
  • Test : JUnit4


💥에러메세지

문제의 테이블에 새로운 데이터로 UPDATE하는 작업 중이었다... 그런데

unique constraint(--DB테이블명--) violated

전형적으로 PK값에서 중복이 나, 데이터의 유일성 제약 조건에 위배된 것이 원인이다.

따라서, 이를 해결하기 위해서는 PK값을 INSERT/UPDATE할 때 어디서 중복났을까?를 생각해야 한다.

🧐문제 해결

문제의 테이블에서 PK값이 약 3개이다. (다중 컬럼으로 기본키를 정의하고 있다.)
각각의 PK컬럼을 확인해보았다.

비지니스적으로 한 컬럼 제외하고 나머지 두개는 도저히 중복이 될 만한하지 않다. 의심되는 컬럼은 시퀀스 컬럼이었다. 넣고자 하는 새로운 LAST 시퀀스가 이미 테이블에 있는 LAST 시퀀스보다 작으면 여기서 중복이 발생하지 않을까?하는 생각이 들었다.

SELECT NVL(MAX(TOT_CMPB_USE_ITM_SUID),0) 
FROM (새롭게 넣어줄 테이블)
결과값 : 5839805

SELECT BSMOWN.SEQ_BSMACV100_01.NEXTVAL 
FROM (현재 테이블)
결과값 : 6017449

이게 제일 유력하지 않을까 했는데 역시나 시퀀스PK에서 중복이 난 것이다.
해당 결과값의 차이만큼 (새롭게 넣어줄 테이블)에 +하여 다시 UPDATE문을 실행했다.

다행히 잘 동작하면서 무사히 UPDATE를 칠 수 있었다. 너무 간단한 문제인데 눈에 안익고 규모가 큰 서비스라고 생각하니까 지레 겁먹었던 거 같다. 로컬 DB니까 (문제나면 운영DB와 동기화하면 됨.) 겁먹지 말자 !

profile
꾸준함의 힘을 아는 개발자📍

0개의 댓글