[PostgreSQL Error] duplicate key value violates unique constraint
에러 발생 이유
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
[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우
PostgreSQL에서 Entity Framework를 사용해서 DB조작할 때 에러에 대한 메모. id컬럼을 Serial형(Auto Increasing)으로 만든 테이블에 id 값을 생략한 형식으로 INSERT를 하려고 했더니 다음과 같은 에러가...
www.dreampharos.com
하기 링크는 일본어로 되어있지만, 번역을 한경우에 한국어로 영어에 비해선 번역이 잘 되서
쉽게 읽을 수 있을 것이다.
PostgreSQLでINSERT時に自動採番の主キーが重複してエラーが出る場合の対処法 -- ぺけみさお
www.xmisao.com
(만약 콘텐츠가 조금이나마.. 도움이 되었다면
광고 한번만 부탁드려도 될까요? ㅎㅎ)