UPDATE A SET B=B2, C=C1 WHERE C=C1 업데이트 쿼리를 MYSQL에서 실행될때 아래와 같은 에러가 발생됨
SQL Error [1062] [23000]: Duplicate entry ‘’ from key ‘PRIMARY’
업데이트 하는 A테이블에 데이터가 아래와 같이 존재
B컬럼 | C컬럼 |
B1 | C1 |
B2 | C1 |
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 중복이 발생한 것입니다. 이를 방지하려면:- 조건을 세분화하여 한 번에 하나의 행만 업데이트하거나,
- 중간 단계를 거쳐 순차적으로 업데이트하는 방식으로 문제를 해결할 수 있습니다.
댓글 없음:
댓글 쓰기