Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ENUM NOT NULL ใน MySQL: ค่า Default ต่างกันเมื่อมี/ไม่มี NOT NULL

พฤติกรรม 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 ValueAllow NULL?
ENUM('A','B')NULLYES
ENUM('A','B') NOT NULL'A' (ค่าแรก)NO
ENUM('A','B') DEFAULT 'B''B'YES
ENUM('A','B') NOT NULL DEFAULT 'B''B'NO

ข้อควรระวัง

  1. Implicit Default: MySQL จะกำหนด Default ให้อัตโนมัติถ้าไม่ระบุ - อาจทำให้ Bug ยากหา
  2. Strict SQL Mode: ใน Strict Mode (STRICT_TRANS_TABLES) INSERT โดยไม่ระบุค่า ENUM NOT NULL จะ Error หากไม่มี Default
  3. 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 ได้ดีกว่า