Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để hoán đổi giá trị của hai hàng trong MySQL mà không vi phạm ràng buộc duy nhất?

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 ;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 cách liệt kê tất cả các bảng trong cơ sở dữ liệu MySQL

  2. Các câu lệnh chuẩn bị sẵn trong PHP ... Biến ràng buộc dưới dạng phạm vi số trong REGEXP?

  3. Trong PHP / MySQL, tôi nên mở nhiều kết nối cơ sở dữ liệu hay dùng chung 1?

  4. Làm thế nào để cập nhật mysql với python trong đó các trường và mục nhập từ từ điển?

  5. Cách tính số người dùng hoạt động hàng tuần (WAU) trong MySQL