สร้างตารางด้วย NOT NULL
mysql> CREATE TABLE DemoTable1895 (
Id INT NOT NULL,
FirstName VARCHAR(20),
LastName VARCHAR(20) NOT NULL
);
ทดสอบ Insert
mysql> INSERT INTO DemoTable1895 VALUES(100, 'John', 'Smith'); -- OK
mysql> INSERT INTO DemoTable1895 VALUES(NULL, 'Chris', 'Brown'); -- ERROR 1048: Id cannot be null
mysql> INSERT INTO DemoTable1895 VALUES(102, 'Carol', NULL); -- ERROR 1048: LastName cannot be null
mysql> INSERT INTO DemoTable1895 VALUES(103, NULL, 'Miller'); -- OK (FirstName ยอม NULL)
ผลลัพธ์
mysql> SELECT * FROM DemoTable1895;
+-----+-----------+----------+
| Id | FirstName | LastName |
+-----+-----------+----------+
| 100 | John | Smith |
| 103 | NULL | Miller |
+-----+-----------+----------+
NOT NULL Constraint
- บังคับให้คอลัมน์ ต้องมีค่า (ไม่ยอม NULL)
- Error 1048 (23000) ถ้า Insert/Update เป็น NULL
- Primary Key → NOT NULL อัตโนมัติ
ALTER TABLE เพิ่ม/ลบ NOT NULL
-- เพิ่ม NOT NULL (ต้องไม่มี NULL อยู่แล้ว)
ALTER TABLE DemoTable1895 MODIFY FirstName VARCHAR(20) NOT NULL;
-- ลบ NOT NULL
ALTER TABLE DemoTable1895 MODIFY FirstName VARCHAR(20) NULL;
NOT NULL vs Default Value
-- NOT NULL + Default: ต้องมีค่า แต่มีค่าเริ่มต้น
CREATE TABLE t (name VARCHAR(20) NOT NULL DEFAULT 'Anonymous');
-- NULL + Default: ยอม NULL ได้ แต่ Default เมื่อไม่ระบุ
CREATE TABLE t (name VARCHAR(20) DEFAULT 'Anonymous');
Best Practices
- Default: ทุกคอลัมน์ควรเป็น
NOT NULL เว้นแต่มีเหตุผลชัดเจน
- ใช้
DEFAULT ร่วมกับ NOT NULL ลด Burden ตอน Insert
- Application Layer ควร Validate ก่อนส่ง INSERT
- Foreign Key Columns: ควรเป็น NOT NULL (ยกเว้น Optional Relationship)
CHECK Constraint (MySQL 8.0.16+)
CREATE TABLE t (
age INT NOT NULL,
CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150)
);