에러 발생 이유
PostgreSQL 에서는 nextval( ) 등을 통해 primary key 를 생략한 채로 자동 시퀀스를 실행하다보면
primary key 자동으로 번호가 지정되는 경우가 있는데,
대게는 unique value 로 번호가 지정이 된다고 한다.
하지만, 데이터 복사 등의 데이터에 변경이 일어나는 모종의 이유로
시퀀스 객체와 테이블의 키 값에 차이가 생기는 경우가 종종 발생하는데, 이런 경우에는
primary key 를 생략한 채로 insert 를 할 경우에는
postgresql 에서 이를 인지하고 오류를 발생시킨다고 한다.
ERROR: duplicate key value violates unique constraint "table_pkey"
해결방법
1. 오류가 난 테이블의 최대 키 값을 조사한다
- 아무 컬럼이나 지정을 해도 상관은 없는 것 같다
나의 경우에는 아래와 같이 처음에 나왔다
SELECT MAX(id) FROM table;
2. 이어 nextval 함수가 있는 시퀀스 오브젝트 값을 확인한다.
아래와 같이 나왔다.
SELECT nextval('table_id_seq');
1번과 2번을 비교해보았을 때, 갯수에서 일치하지 않는 것을 확인할 수 있다.
nextval( ) 을 도중에 생성을 했기 때문에 아래 에러가 발생을 한것 같다
만약에 두 값이 일치한다면 문제가 없다.
ERROR: duplicate key value violates unique constraint "table_pkey"
3. 두 값이 불일치하는 경우 시퀀스 오브젝트 값을 테이블 컬럼 값으로 변경해준다.
변경 후 아래와 같이 갯수가 변경이 되었으며 에러는 완전히 사라졌다.
SELECT setval('table_id_seq', (SELECT MAX(id) FROM table));
다음은 위 답을 얻는데 참고한 링크들이다.
참고링크
www.dreampharos.com/2019/12/postgresql-insert-pk.html
하기 링크는 일본어로 되어있지만, 번역을 한경우에 한국어로 영어에 비해선 번역이 잘 되서
쉽게 읽을 수 있을 것이다.
(만약 콘텐츠가 조금이나마.. 도움이 되었다면
광고 한번만 부탁드려도 될까요? ㅎㅎ)