Không (không có gì mà tôi có thể nghĩ ra).
Vấn đề là MySQL xử lý cập nhật như thế nào. MySQL (khác với các DBMS khác triển khai UPDATE
đúng cách), xử lý các bản cập nhật theo cách bị hỏng. Nó thực thi kiểm tra UNIQUE
(và các ràng buộc khác) sau mỗi lần cập nhật hàng đơn lẻ và không - như nó phải làm - sau toàn bộ UPDATE
câu lệnh hoàn thành. Đó là lý do tại sao bạn không gặp sự cố này với (hầu hết) các DBMS khác.
Đối với một số cập nhật (như tăng tất cả hoặc một số id, id=id+1
), điều này có thể được giải quyết bằng cách sử dụng - một tính năng không chuẩn khác - ORDER BY
trong bản cập nhật.
Để hoán đổi các giá trị từ hai hàng, thủ thuật đó không thể giúp được. Bạn sẽ phải sử dụng NULL
hoặc một giá trị không có thật (không tồn tại nhưng được cho phép trong cột của bạn) và 2 hoặc 3 câu lệnh.
Bạn cũng có thể tạm thời loại bỏ ràng buộc duy nhất nhưng tôi không nghĩ đó thực sự là một ý kiến hay.
Vì vậy, nếu cột duy nhất là một số nguyên có dấu và không có giá trị âm, bạn có thể sử dụng 2 câu lệnh được gói gọn trong một giao dịch:
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 ;