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

วิธีเพิ่ม CHECK CONSTRAINT ในตาราง MySQL

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