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

MySQL创建触发器报Unknown column 'created_by'错误求助

问题原因分析
  • 触发器内引用待插入行的字段必须加NEW.前缀:你直接写created_by、type_id这些字段时,MySQL无法识别是当前待插入行的字段,必须写成NEW.created_by、NEW.type_id格式,这是触发1054错误的直接原因
  • IF条件的逻辑与运算符使用错误:你用逗号分隔多个判断条件是语法错误,多条件同时满足需要用AND关键字连接
  • 待修正的隐含问题:
    1. 你提供的transactions表DDL中没有定义status字段,需要先确认是否漏建该字段,否则触发器中操作NEW.status仍会报错
    2. 子查询select id from users where role_id=2如果返回多条记录会触发运行错误,建议加LIMIT 1或者改用EXISTS写法避免该问题
    3. 触发器名包含横杠-,需要用反引号包裹避免语法解析错误
修复后的完整代码
-- 先确认transactions表是否有status字段,没有的话先执行添加语句
ALTER TABLE transactions ADD COLUMN status VARCHAR(32) NOT NULL DEFAULT '';
DELIMITER //
CREATE DEFINER=`root`@`localhost` TRIGGER `txn-trg` 
BEFORE INSERT ON transactions 
FOR EACH ROW
BEGIN
  IF (NEW.created_by = (SELECT id FROM users WHERE role_id=2 LIMIT 1) 
      AND NEW.type_id=1 
      AND NEW.internal_status_id=2 
      AND NEW.status='STL')
  THEN 
    SET NEW.status='FINANCE';  
  ELSEIF (NEW.status<>'STL'
          AND NEW.internal_status_id<>2
          AND NEW.type_id<>1) 
  THEN 
    -- 注意:当前写法是赋值为字符串'status',如果要保留原始值请改为SET NEW.status = NEW.status
    SET NEW.status='status';
  END IF;
END //
DELIMITER ;
注意事项
  • 代码中的LIMIT 1是为了避免role_id=2的用户有多个时子查询返回多条记录报错,如果确定role_id=2的用户只有1个可以去掉
  • BEFORE INSERT触发器中修改NEW的字段值,会最终写入到插入的行中

内容的提问来源于stack exchange,提问作者fish water

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:36:01