>  기사  >  데이터 베이스  >  무결성을 위반하지 않고 고유 제약 조건을 사용하여 MySQL의 행 값을 교환하는 방법은 무엇입니까?

무결성을 위반하지 않고 고유 제약 조건을 사용하여 MySQL의 행 값을 교환하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 00:23:28152검색

How to Swap Row Values in MySQL with a Unique Constraint Without Violating Integrity?

고유 제약 조건을 유지하면서 MySQL에서 행 값 교환

MySQL에서 테이블의 두 행 사이의 우선순위 값을 교환하는 작업은 고유 제약조건은 제약조건 위반으로 인해 오류가 발생할 수 있습니다. 문제를 이해하기 위해 일반적인 UPDATE 문을 살펴보겠습니다.

UPDATE tasks 
SET priority = 
CASE
    WHEN priority=2 THEN 3 
    WHEN priority=3 THEN 2 
END 

WHERE priority IN (2,3);

그러나 이 문은 오류를 발생시킵니다.

Error Code: 1062. Duplicate entry '3' for key 'priority_UNIQUE'

문제의 성격

MySQL은 다른 DBMS와 다르게 업데이트를 처리합니다. 전체 문이 완료된 후가 아니라 각 행 업데이트 후에 제약 조건 위반을 확인합니다. 결과적으로 값 교환은 고유 제약 조건을 직접적으로 위반합니다.

가짜 값이나 다중 쿼리가 없는 대안

안타깝게도 MySQL의 중간 값(가짜 또는 null) 또는 다중 쿼리. 고유 제약 조건은 각 행 업데이트 후에 고유성을 적용하므로 직접 교체가 불가능합니다.

임시 제약 조건 제거

한 가지 옵션은 고유 제약 조건을 일시적으로 제거하고 스왑 작업을 실행하는 것입니다. 를 누른 다음 제약 조건을 다시 추가하세요. 그러나 이 접근 방식은 데이터 무결성을 손상시키므로 권장되지 않습니다.

가짜 값 및 다중 쿼리

권장되는 접근 방식은 일시적으로 가짜 값(-3)을 사용하는 것입니다. 첫 번째 행의 우선순위 값을 유지하고 이를 두 번째 행의 값으로 바꿉니다. 트랜잭션 내에는 두 가지 쿼리가 필요합니다.

START TRANSACTION ;
    UPDATE tasks 
    SET priority = 
      CASE
        WHEN priority = 2 THEN -3 
        WHEN priority = 3 THEN -2 
      END 
    WHERE priority IN (2,3) ;

    UPDATE tasks 
    SET priority = - priority
    WHERE priority IN (-2,-3) ;
COMMIT ;

이 프로세스는 스왑 작업 중에 제약 조건이 위반되지 않도록 합니다.

위 내용은 무결성을 위반하지 않고 고유 제약 조건을 사용하여 MySQL의 행 값을 교환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.