Vấn đề: Thay thế giá trị NULL trong cột số bằng 1 (hoặc giá trị khác)
Giải pháp: UPDATE với IFNULL()
IFNULL(expr, default) trả về default nếu expr là NULL.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (Counter INT);
INSERT INTO DemoTable VALUES (20), (NULL), (99), (49), (NULL);
2. Dữ liệu trước
+---------+
| Counter |
+---------+
| 20 |
| NULL |
| 99 |
| 49 |
| NULL |
+---------+
3. Cập nhật NULL → 1
UPDATE DemoTable
SET Counter = IFNULL(Counter, 0) + 1
WHERE Counter IS NULL;
IFNULL(Counter, 0) chuyển NULL thành 0, +1 = 1. WHERE Counter IS NULL chỉ cập nhật hàng NULL (tối ưu).
4. Kết quả
+---------+
| Counter |
+---------+
| 20 |
| 1 |
| 99 |
| 49 |
| 1 |
+---------+
Các hàm xử lý NULL tương tự
| Hàm | Mô tả | Ví dụ |
|---|---|---|
IFNULL(a, b) | Trả b nếu a=NULL (2 args, MySQL) | IFNULL(col, 0) |
COALESCE(a, b, c...) | Trả giá trị đầu không NULL (ANSI, n args) | COALESCE(a, b, 0) |
NULLIF(a, b) | Trả NULL nếu a=b | NULLIF(col, 0) |
IS NULL / IS NOT NULL | Kiểm tra NULL (không dùng = NULL) | WHERE col IS NULL |
Lưu ý
- Luôn có
WHERE Counter IS NULLđể tránh cập nhật toàn bảng (tốn ресурс, ghi binlog). - Nếu muốn đặt NULL thành giá trị cố định:
SET Counter = 1 WHERE Counter IS NULL(đơn giản hơn). IFNULL(Counter, 0) + 1hữu ích khi logic: "nếu NULL thì coi như 0, rồi cộng 1".