Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Kiểm tra giá trị cột là NULL hay có giá trị DEFAULT trong MySQL?

Sử dụng IFNULL() kết hợp với hàm DEFAULT() để phân biệt giữa NULL do người dùng nhập và NULL do mặc định.

Tạo bảng với DEFAULT

mysql> CREATE TABLE DemoTable (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name VARCHAR(100) DEFAULT 'Larry',
    -> Age INT DEFAULT NULL
    -> );

Chèn dữ liệu

mysql> INSERT INTO DemoTable(Name, Age) VALUES('John', 23);  -- Cung cấp cả 2
mysql> INSERT INTO DemoTable VALUES();                       -- Mặc định cả 2
mysql> INSERT INTO DemoTable(Name) VALUES('David');          -- Chỉ Name, Age = DEFAULT NULL
mysql> INSERT INTO DemoTable(Age) VALUES(24);                -- Chỉ Age, Name = DEFAULT 'Larry'

Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+----+-------+------+
| Id | Name  | Age  |
+----+-------+------+
| 1  | John  | 23   |
| 2  | Larry | NULL |
| 3  | David | NULL |
| 4  | Larry | 24   |
+----+-------+------+

Tìm hàng nơi Name KHÁC giá trị mặc định ('Larry')

mysql> SELECT * FROM DemoTable 
    -> WHERE IFNULL(Name, DEFAULT(Name)) <> DEFAULT(Name);
+----+-------+------+
| Id | Name  | Age  |
+----+-------+------+
| 1  | John  | 23   |
| 3  | David | NULL |
+----+-------+------+

Giải thích logic

  • DEFAULT(Name) trả về giá trị mặc định của cột Name ('Larry')
  • IFNULL(Name, DEFAULT(Name)): Nếu Name là NULL thì dùng DEFAULT(Name), ngược lại giữ Name
  • So sánh <> DEFAULT(Name) loại bỏ các hàng có Name = 'Larry' (kể cả do mặc định hoặc nhập tay)

Phân biệt NULL nhập tay vs DEFAULT NULL

MySQL không phân biệt được giữa INSERT INTO t VALUES() (mặc định) và INSERT INTO t(Name) VALUES(NULL) (nhập NULL rõ ràng) — cả hai đều lưu NULL. Cách trên chỉ kiểm tra giá trị khác DEFAULT, không phân biệt nguồn gốc NULL.

Cách khác: Kiểm tra cột có DEFAULT không

SELECT COLUMN_NAME, COLUMN_DEFAULT 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'DemoTable' AND COLUMN_DEFAULT IS NOT NULL;