이전에 재직했던 곳에서는 RDBMS를 오라클로 모두 쓰고 있다. 개인적으로 플젝을 할때나, 팀프로젝트에서는 한번도 안써봤던 거지만, MySQL이나 오라클이나 거의 같은 뿌리를 가지고 있어서 사소한 문법 말고는 비슷하다. (하지만 성능은 역시 오라클이...👍크으)
문제는 소규모로 프로젝트를 하거나 할 때는 못 겪어본 오류메시지가 너무 많아서 나를위해 정리할 겸 끄적여볼 것 이다.
먼저 쓰고 있는 스킬셋은 다음과 같다. (여기서는 그닥 중요하지 않다)
문제의 테이블에 새로운 데이터로 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와 동기화하면 됨.) 겁먹지 말자 !