집 >데이터 베이스 >MySQL 튜토리얼 >무결성을 위반하지 않고 고유 제약 조건을 사용하여 MySQL의 행 값을 교환하는 방법은 무엇입니까?
고유 제약 조건을 유지하면서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!