MySQL不开启strict/traditional模式时如何禁止错误enum值插入生成空字符串
问题结论
可以在不启用strict/traditionalSQL模式的前提下实现该需求,以下是两种通用可行方案:
方案1:CHECK约束校验(适用于MySQL 8.0.16及以上版本)
MySQL 8.0.16开始正式支持生效的CHECK约束,建表时追加取值校验规则即可直接拦截非法枚举值,不会生成空字符串写入:
CREATE TABLE test ( foo enum('aaa','bbb') NOT NULL, CHECK (foo IN ('aaa','bbb')) );
测试插入非法值:INSERT INTO test VALUES('asd');会直接抛出错误,写入操作被终止。
方案2:BEFORE INSERT触发器拦截(兼容全MySQL版本)
如果使用的是不支持CHECK约束的旧版本MySQL,可以通过前置触发器实现相同的校验逻辑:
-- 先创建测试表 CREATE TABLE test ( foo enum('aaa','bbb') NOT NULL ); -- 新增插入前校验触发器 DELIMITER // CREATE TRIGGER check_foo_enum BEFORE INSERT ON test FOR EACH ROW BEGIN IF NEW.foo NOT IN ('aaa','bbb') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'foo字段仅允许插入aaa/bbb'; END IF; END // DELIMITER ;
触发器会在每条数据写入前校验取值,非法值直接抛出错误终止操作,不会生成空字符串。
上述两种方案均不需要修改全局/会话级别的
sql_mode为strict或traditional模式,仅针对当前表的枚举字段做针对性校验即可。
内容的提问来源于stack exchange,提问作者Wergio
相关产品推荐
相关产品推荐

