创建MySQL触发器验证shift_name列输入失效问题排查
问题修复方案
你的触发器无法正常工作,核心是存在语法和逻辑错误,以下是修正后的代码及问题说明:
错误点分析
- 逻辑完全颠倒:当前代码是当输入值属于允许的三个选项时触发错误,这和校验需求完全相反,应该是输入值不在允许列表里才报错。
- 缺少行级触发器关键字:MySQL的触发器需要
FOR EACH ROW指定行级触发,原代码遗漏了这个关键语法。 - 标识符引号错误:MySQL中触发器名称不能用双引号包裹,直接写名称即可(若名称含特殊字符可用反引号)。
- 拼写错误:错误消息里的
wright应为write。
修正后的完整代码
CREATE TABLE IF NOT EXISTS shift ( shift_id INT PRIMARY KEY AUTO_INCREMENT, section_name VARCHAR(255) NOT NULL, week_day VARCHAR(255) NOT NULL DEFAULT "please write one of the days of week", shift_name VARCHAR(255) NOT NULL DEFAULT "please write one of Morning, Afternoon, or Night", personnel_need INT ) AUTO_INCREMENT = 3101; DELIMITER $$ CREATE TRIGGER test_before_insert ON shift FOR INSERT FOR EACH ROW BEGIN -- 输入值不在允许列表时触发错误 IF (NEW.shift_name NOT IN ('Morning', 'Afternoon', 'Night')) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'please write one of Morning, Afternoon, or Night'; END IF; END; $$ DELIMITER ;
额外简化方案
MySQL 8.0.16及以上版本支持CHECK约束,用它做列取值校验更简洁,无需触发器:
ALTER TABLE shift ADD CONSTRAINT chk_shift_name CHECK (shift_name IN ('Morning', 'Afternoon', 'Night'));
内容的提问来源于stack exchange,提问作者Siavosh
相关产品推荐
相关产品推荐

