真实建一个CHECK约束,从INSERT和UPDATE两个方向去撞它,验证这个MySQL 8.0.16才真正生效的功能到底管不管用。
代码CREATE TABLE check_test ( id INT PRIMARY KEY, age INT, CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150) ); INSERT INTO check_test VALUES (1, 30); -- 合法值,先插入一条基准数据
INSERT INTO check_test VALUES (2, -5); ERROR 3819: Check constraint 'chk_age' is violated. INSERT INTO check_test VALUES (3, 200); ERROR 3819: Check constraint 'chk_age' is violated. UPDATE check_test SET age = -1 WHERE id=1; ERROR 3819: Check constraint 'chk_age' is violated.
三次真实操作,两次INSERT一次UPDATE,都真实被同一条chk_age约束拦了下来,错误码统一是3819——CHECK约束不只是在插入时生效,任何会导致某一行违反约束的写操作(包括UPDATE)都会真实被检查,这和唯一索引、外键这些约束的生效范围是一致的。
每一步都是本文上面用真实DDL和DML跑出来的原始结果。
information_schema.CHECK_CONSTRAINTS:查看约束的真实存储表达式