MySQL 8.0.16+ รองรับ CHECK CONSTRAINT อย่างแท้จริง (Enforced) รุ่นก่อนหน้าจะ Parse แต่ไม่ Enforce
Syntax การสร้างตารางพร้อม CHECK
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
CONSTRAINT constraint_name CHECK (condition)
);
ตัวอย่าง: ตรวจสอบอายุต้องมากกว่าหรือเท่ากับ 18
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
age INT,
CONSTRAINT chk_age CHECK (age >= 18)
);
ทดสอบ Constraint
-- ผ่าน (Age 20 >= 18)
INSERT INTO users (name, age) VALUES ('John', 20);
-- Query OK
-- ล้มเหลว (Age 15 < 18)
INSERT INTO users (name, age) VALUES ('Bob', 15);
-- ERROR 3819 (HY000): Check constraint 'chk_age' is violated.
เพิ่ม CHECK CONSTRAINT ในตารางที่มีอยู่แล้ว
ALTER TABLE users
ADD CONSTRAINT chk_age CHECK (age >= 18);
ลบ CHECK CONSTRAINT
ALTER TABLE users
DROP CHECK chk_age;
เงื่อนไขที่ใช้ได้ใน CHECK
- Comparison:
=, !=, >, <, >=, <= - Logical:
AND, OR, NOT - Functions:
LENGTH(), UPPER(), LOWER(), DATE(), YEAR()(Deterministic เท่านั้น) - ไม่ได้ใช้: Subquery, Stored Function, Non-deterministic Functions (NOW(), RAND(), UUID())
ตัวอย่างเพิ่มเติม
-- Email Format
CONSTRAINT chk_email CHECK (email LIKE '%@%.%')
-- Status Enum-like
CONSTRAINT chk_status CHECK (status IN ('active', 'inactive', 'pending'))
-- Range
CONSTRAINT chk_score CHECK (score BETWEEN 0 AND 100)
-- Cross-column (MySQL 8.0.16+)
CONSTRAINT chk_dates CHECK (end_date >= start_date)
ข้อจำกัด
- ไม่รองรับ Subquery
- ไม่รองรับ Non-deterministic Functions
- ไม่ทำงานกับ Partitioned Tables (บาง Version)
- Performance: ตรวจสอบทุก INSERT/UPDATE