2024년 12월 14일 토요일

UPDATE_INSERT할때 왜 Duplicate entry ‘’ for key ‘PRIMARY’ 에러가 발생되는걸까

UPDATE A SET B=B2, C=C1 WHERE C=C1 업데이트 쿼리를 MYSQL에서 실행될때 아래와 같은 에러가 발생됨
SQL Error [1062] [23000]: Duplicate entry ‘’ from key ‘PRIMARY’
업데이트 하는 A테이블에 데이터가 아래와 같이 존재
B컬럼C컬럼
B1C1
B2C1
B,C컬럼 모두 PK로 잡혀있음

위 조건으로 AI한테 물어보면

1. 상황 요약

  • 초기 데이터:
    css
    코드 복사
    B C
    ---- ----
    B1 C1
    B2 C1
    • A 테이블의 PK는 (B, C) 복합 키입니다.
    • 데이터는 B1, C1과 B2, C1 두 행이 존재합니다.
  • 수행된 쿼리:
    sql
    코드 복사
    UPDATE A SET B = B2, C = C1 WHERE C = C1;
  • 결과:
    • WHERE C = C1 조건으로 두 행(B1, C1과 B2, C1)이 모두 업데이트 대상으로 선택됩니다.
    • 업데이트가 진행되면서 (B2, C1) 중복으로 인해 Duplicate entry 에러 발생.

2. 원인 분석

UPDATE 쿼리에서 발생한 에러의 원인은 다음과 같습니다:

2.1 UPDATE 대상 행이 2개

  • 조건 WHERE C = C1으로 인해 두 행(B1, C1과 B2, C1)이 모두 업데이트 대상이 됩니다.
    • 첫 번째 행(B1, C1)이 업데이트되어 (B2, C1)로 변경됩니다.
    • 두 번째 행(B2, C1)을 업데이트하려고 할 때 이미 동일한 (B2, C1)이 존재하므로 Duplicate Entry 에러가 발생합니다.

2.2 복합 키 (B, C)의 유일성 제약 위반

  • A 테이블의 PK가 (B, C)로 설정되어 있으므로, B와 C의 조합이 반드시 유일해야 합니다.
  • 두 행 모두 (B2, C1)로 변경되면 PK 조건을 위반하게 됩니다.

3. 해결 방법

Duplicate Entry 에러를 방지하려면, UPDATE 쿼리를 수정하여 한 번에 중복된 PK가 생성되지 않도록 해야 합니다.

3.1 조건을 더 명확히 지정

  • 두 행을 동시에 업데이트하지 않도록 조건을 구체화합니다.
    • 예를 들어, B1 또는 B2에 따라 구분:
      sql
      코드 복사
      UPDATE A SET B = B2, C = C1 WHERE B = B1;

3.2 순차적으로 업데이트

  • 두 행을 동시에 업데이트하지 않고, 하나씩 순차적으로 처리합니다.
    sql
    코드 복사
    -- 첫 번째 행 업데이트
    UPDATE A SET B = 'TEMP', C = C1 WHERE B = B1;

    -- 두 번째 행 업데이트
    UPDATE A SET B = B2, C = C1 WHERE B = 'TEMP';

3.3 PK 중복 방지

  • PK 제약 조건이 있는 상황에서 동일한 (B, C)가 생성되지 않도록 논리를 수정해야 합니다. 예를 들어, 업데이트 전에 PK의 중복 가능성을 사전에 확인합니다:
    sql
    코드 복사
    SELECT B, C FROM A WHERE B = B2 AND C = C1;

3.4 별도 임시 테이블 사용

  • 중복 문제를 피하기 위해 업데이트하려는 데이터를 임시 테이블에 저장한 뒤 처리합니다:
    sql
    코드 복사
    CREATE TEMPORARY TABLE temp_table AS
    SELECT * FROM A WHERE C = C1;

    UPDATE A
    SET B = B2, C = C1
    WHERE B IN (SELECT B FROM temp_table);

4. 결론

UPDATE A SET B = B2, C = C1 WHERE C = C1 쿼리에서 WHERE C = C1 조건으로 두 행이 동시에 업데이트되면서 PK 중복이 발생한 것입니다. 이를 방지하려면:
  1. 조건을 세분화하여 한 번에 하나의 행만 업데이트하거나,
  2. 중간 단계를 거쳐 순차적으로 업데이트하는 방식으로 문제를 해결할 수 있습니다.

댓글 없음:

댓글 쓰기