mariaDB 에서 PostgreSQL 로 변경하고 나서 데이터를 추가하니 이런 에러가 발생한다.

PK 시퀀스가 자동으로 증가된 값을 인지하지 못해서 생기는 현상이라고 한다.

 

1
2
3
4
5
6
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,textvalues (?,?,?,?)]; SQL [insert into menu_orgchart (depth,name,parent_id,textvalues (?,?,?,?)]; 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$$;
 

 

 

 

 

 

728x90
블로그 이미지

Link2Me

,