[에러노트] nextval(sequence) ,duplicate key value violates unique constraint..

hyewon jeong·2024년 3월 26일
0

에러노트

목록 보기
39/46

1 발생

게시글을 등록하려는 경우 평소에는 잘되다가 갑자기 아래와 같은 에러로 ,
a_table에 이미 a_sn 값이 존재한다고 한다.
하지만 sn 값은 nextval() 과 해당 테이블의 시퀀스를 이용하였기 때문에 왜 중복현상이 일어나는지 ..


2 코드

INSERT INTO a_table(a_sn, a_nm, a_expln)
VALUES(nextval('seq_a_table'),#{aNm}, #{aExpln})

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "a_table" Detail: Key (a_sn)=(21) already exists.


3 원인

nextval('seq_a_table')을 통해 시퀀스에서 다음 값을 가져오려고 했지만, 이 시퀀스가 반환한 값(21)이 a_sn에 이미 존재하는 값이다.
이는 시퀀스의 현재 값이 데이터베이스 내의 a_sn 최대값보다 낮거나 같다는 것을 의미합니다.
보통의 경우 spring 을 통해 데이터베이스와 상호작용하여 데이터 관리를 해야 한다. 하지만 테스트 할 때 종종 DB에서 직접 데이터 조작 할 경우 데이터의 무결성이 깨질 수 있다.


4 해결

  1. 오류가 난 테이블의 최대 키 값을 조회한다.
select max(a_sn)
from a_table

  1. nextval 함수가 있는 sequence 값을 조회한다.
SELECT NEXTVAL('seq_a_table');

  1. 같은 값으로 맞춘다.
SELECT setval('seq_a_table', COALESCE((SELECT MAX(a_sn) FROM a_table), 0)::bigint);
profile
개발자꿈나무

4개의 댓글

comment-user-thumbnail
2024년 3월 29일

머싯습니다!

1개의 답글
comment-user-thumbnail
2024년 4월 4일

멋있습니다!

1개의 답글