Cập nhật có điều kiện: Bỏ qua một giá trị cụ thể trong MySQL
Sử dụng hàm IF() trong mệnh đề SET của UPDATE để áp dụng giá trị mới cho tất cả hàng, trừ hàng có giá trị cụ thể (giữ nguyên hoặc đặt giá trị khác).
Ví dụ minh họa
Tạo bảng DemoTable736:
mysql> CREATE TABLE DemoTable736 (
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName VARCHAR(100),
isMarried BOOLEAN
);
Query OK, 0 rows affected (0.53 sec)
Chèn dữ liệu (CustomerId=5 đã có isMarried=1):
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('Chris',0);
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('Robert',0);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('David',0);
Query OK, 1 row affected (0.24 sec)
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('Mike',0);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable736(CustomerName,isMarried) VALUES('Bob',0);
Query OK, 1 row affected (0.20 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 0 | | 2 | Robert | 0 | | 3 | David | 0 | | 4 | Mike | 0 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
Cập nhật isMarried = 1 cho TẤT CẢ hàng, TRỪ CustomerId=5 (giữ nguyên 1):
mysql> UPDATE DemoTable736 SET isMarried = IF(CustomerId = 5, 1, 1); Query OK, 5 rows affected (0.13 sec) Rows matched: 6 Changed: 5 Warnings: 0
Kết quả (tất cả thành 1, CustomerId=5 giữ nguyên 1):
mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 1 | | 2 | Robert | 1 | | 3 | David | 1 | | 4 | Mike | 1 | | 5 | Carol | 1 | | 6 | Bob | 1 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
Giải thích logic IF()
IF(CustomerId = 5, 1, 1) │ │ │ │ │ └── Giá trị khi FALSE (CustomerId ≠ 5) → 1 │ └── Giá trị khi TRUE (CustomerId = 5) → 1 └── Điều kiện
Ví dụ này cả 2 nhánh đều trả về 1 → thực chất cập nhật tất cả thành 1. Ví dụ có ý nghĩa hơn:
Ví dụ thực tế: Đặt isMarried=1 cho tất cả TRỪ Carol (Id=5) đặt thành 0
UPDATE DemoTable736 SET isMarried = IF(CustomerId = 5, 0, 1);
Cách khác: WHERE NOT IN (đơn giản hơn cho trường hợp này)
-- Cập nhật tất cả KHÔNG phải Id=5 UPDATE DemoTable736 SET isMarried = 1 WHERE CustomerId != 5; -- Hoặc UPDATE DemoTable736 SET isMarried = 1 WHERE CustomerId NOT IN (5);
Khi nào dùng IF() trong UPDATE?
- Cần đặt giá trị khác nhau cho các nhóm hàng trong 1 câu lệnh
- Logic phức tạp hơn đơn giản include/exclude
- Ví dụ:
SET status = IF(balance > 0, 'active', 'inactive')