Hành vi khác biệt
Kiểu ENUM trong MySQL có hành vi mặc định phụ thuộc vào NOT NULL:
| Định nghĩa cột | Giá trị mặc định khi INSERT không chỉ định |
|---|---|
ENUM('YES','NO') | NULL |
ENUM('YES','NO') NOT NULL | Giá trị đầu tiên của ENUM ('YES') |
Case 1: ENUM cho phép NULL
CREATE TABLE DemoTable1 (isMarried ENUM('YES','NO'));
INSERT INTO DemoTable1 VALUES (); -- không chỉ định giá trị
SELECT * FROM DemoTable1;
Kết quả:
+-----------+
| isMarried |
+-----------+
| NULL |
+-----------+
Case 2: ENUM NOT NULL
CREATE TABLE DemoTable2 (isMarried ENUM('YES','NO') NOT NULL);
INSERT INTO DemoTable2 VALUES ();
SELECT * FROM DemoTable2;
Kết quả:
+-----------+
| isMarried |
+-----------+
| YES |
+-----------+
Tóm tắt quy tắc
- Không có NOT NULL: Mặc định là
NULL(trừ khi cóDEFAULTtường minh). - Có NOT NULL: Mặc định là phần tử đầu tiên của ENUM list.
- Có DEFAULT 'value': Ghi đè cả hai trường hợp trên.
Best Practice
- Luôn khai báo
NOT NULL+DEFAULT 'giá_trị_mong_muốn'để tránh surprise. - Ví dụ:
status ENUM('active','inactive','pending') NOT NULL DEFAULT 'pending'. - Tránh phụ thuộc vào hành vi mặc định ngầm (implicit default).
Lưu ý thêm
- ENUM lưu trữ dưới dạng số nguyên nội bộ (1, 2, 3... theo thứ tự khai báo).
- Sắp xếp ENUM theo thứ tự khai báo, không theo alphabet.
- MySQL 8.0.16+ hỗ trợ
CHECK constraintcó thể thay thế ENUM cho một số trường hợp.