mariaDB 에서 PostgreSQL 로 변경하고 나서 데이터를 추가하니 이런 에러가 발생한다.
PK 시퀀스가 자동으로 증가된 값을 인지하지 못해서 생기는 현상이라고 한다.
|
2025-06-04T13:32:47.652+09:00 WARN 22624 --- [mall] [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 23505
2025-06-04T13:32:47.652+09:00 ERROR 22624 --- [mall] [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : 오류: 중복된 키 값이 "menu_orgchart_pkey" 고유 제약 조건을 위반함
Detail: (id)=(7) 키가 이미 있습니다.
2025-06-04T13:32:47.658+09:00 ERROR 22624 --- [mall] [nio-8080-exec-6] c.m.s.a.m.a.s.filter.JWTCheckFilter : JWT Check Failed: Request processing failed: org.springframework.dao.DataIntegrityViolationException: could not execute statement [오류: 중복된 키 값이 "menu_orgchart_pkey" 고유 제약 조건을 위반함
Detail: (id)=(7) 키가 이미 있습니다.] [insert into menu_orgchart (depth,name,parent_id,text) values (?,?,?,?)]; SQL [insert into menu_orgchart (depth,name,parent_id,text) values (?,?,?,?)]; constraint [null]
|
해결 방법은 아래와 같다.
PostgreSQL 에 접속한 다음에 해당 DB에 접속한다.
아래 명령어를 한번만 해주면 해결된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
DO $$
DECLARE
rec RECORD;
BEGIN
-- SERIAL, BIGSERIAL 컬럼의 시퀀스와 테이블/컬럼 정보를 얻어서
FOR rec IN
SELECT
s.relname AS sequence_name,
t.relname AS table_name,
a.attname AS column_name
FROM
pg_class s
JOIN pg_depend d ON d.objid = s.oid
JOIN pg_class t ON d.refobjid = t.oid
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = d.refobjsubid
WHERE
s.relkind = 'S'
AND d.deptype = 'a'
LOOP
-- setval을 수행
EXECUTE format(
'SELECT setval(''%I'', COALESCE((SELECT MAX(%I) FROM %I), 1))',
rec.sequence_name,
rec.column_name,
rec.table_name
);
END LOOP;
END$$;
|