พฤติกรรม ENUM ต่างกันระหว่างมีและไม่มี NOT NULL
ENUM ใน MySQL มีค่า Default ที่แตกต่างกัน ขึ้นกับว่าประกาศ NOT NULL หรือไม่
CASE 1: ENUM โดยไม่มี NOT NULL → Default = NULL
CREATE TABLE DemoTable1 (
isMarried ENUM('YES', 'NO')
);
INSERT INTO DemoTable1 VALUES(); -- ไม่ระบุค่า
SELECT * FROM DemoTable1;
ผลลัพธ์:
+-----------+
| isMarried |
+-----------+
| NULL |
+-----------+
CASE 2: ENUM มี NOT NULL → Default = ค่าแรกของ ENUM
CREATE TABLE DemoTable2 (
isMarried ENUM('YES', 'NO') NOT NULL
);
INSERT INTO DemoTable2 VALUES(); -- ไม่ระบุค่า
SELECT * FROM DemoTable2;
ผลลัพธ์:
+-----------+
| isMarried |
+-----------+
| YES |
+-----------+
สรุปพฤติกรรม
| การประกาศ | Default Value | Allow NULL? |
|---|---|---|
| ENUM('A','B') | NULL | YES |
| ENUM('A','B') NOT NULL | 'A' (ค่าแรก) | NO |
| ENUM('A','B') DEFAULT 'B' | 'B' | YES |
| ENUM('A','B') NOT NULL DEFAULT 'B' | 'B' | NO |
ข้อควรระวัง
- Implicit Default: MySQL จะกำหนด Default ให้อัตโนมัติถ้าไม่ระบุ - อาจทำให้ Bug ยากหา
- Strict SQL Mode: ใน Strict Mode (
STRICT_TRANS_TABLES) INSERT โดยไม่ระบุค่า ENUM NOT NULL จะ Error หากไม่มี Default - Best Practice: ระบุ
NOT NULLและDEFAULT 'value'ให้ชัดเจนเสมอ
ตัวอย่าง Best Practice
CREATE TABLE users (
status ENUM('active', 'inactive', 'pending') NOT NULL DEFAULT 'pending',
role ENUM('admin', 'user', 'guest') NOT NULL DEFAULT 'user'
);
ENUM vs CHECK Constraint (MySQL 8.0.16+)
-- ใช้ CHECK แทน ENUM (ยืดหยุ่นกว่า, Standard SQL)
CREATE TABLE users (
status VARCHAR(20) NOT NULL DEFAULT 'pending',
CHECK (status IN ('active', 'inactive', 'pending'))
);
ข้อดี CHECK: เพิ่ม/ลดค่าได้ด้วย ALTER TABLE, Portable ระหว่าง DB, Index ได้ดีกว่า