You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:32:03