MySQL 5.7+ hỗ trợ Generated Column (cột sinh ra), có thể dùng để mô phỏng CHECK constraint.
Ví dụ: Kiểm tra định dạng biển số (AB-235-YZ)
mysql> CREATE TABLE car2 (number CHAR(9));
mysql> INSERT INTO car2 VALUES('AB-235-YZ'); -- hợp lệ
mysql> INSERT INTO car2 VALUES('AB-2X5-YZ'); -- không hợp lệ nhưng được chấp nhận
Thêm cột ảo (VIRTUAL GENERATED) với điều kiện CHECK
mysql> ALTER TABLE car2 ADD COLUMN number_validate CHAR(0) AS (
CASE WHEN number RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$' THEN '' END
) VIRTUAL NOT NULL;
Query OK, 0 rows affected (0.53 sec)
mysql> DESCRIBE car2;
+-----------------+---------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------------------+
| number | char(9) | YES | | NULL | |
| number_validate | char(0) | NO | | NULL | VIRTUAL GENERATED |
+-----------------+---------+------+-----+---------+-------------------+
Cột number_validate là cột ảo (không lưu trữ), kiểu CHAR(0), NOT NULL. Biểu thức CASE WHEN ... THEN '' END trả về chuỗi rỗng nếu hợp lệ, NULL nếu không. Vì cột NOT NULL, MySQL sẽ từ chối INSERT/UPDATE giá trị không hợp lệ.
Kiểm tra
mysql> INSERT INTO car2(number) VALUES('AB-235-YZ'); -- OK
mysql> INSERT INTO car2(number) VALUES('AB-2X5-YZ');
ERROR 1048 (23000): Column 'number_validate' cannot be null
mysql> UPDATE car2 SET number='AB-2X5-YZ';
ERROR 1048 (23000): Column 'number_validate' cannot be null
Cách này gọn nhẹ hơn trigger, không cần code thủ tục.