MySQL创建触发器报Unknown column 'created_by'错误求助
问题原因分析
- 触发器内引用待插入行的字段必须加
NEW.前缀:你直接写created_by、type_id这些字段时,MySQL无法识别是当前待插入行的字段,必须写成NEW.created_by、NEW.type_id格式,这是触发1054错误的直接原因 - IF条件的逻辑与运算符使用错误:你用逗号分隔多个判断条件是语法错误,多条件同时满足需要用
AND关键字连接 - 待修正的隐含问题:
- 你提供的
transactions表DDL中没有定义status字段,需要先确认是否漏建该字段,否则触发器中操作NEW.status仍会报错 - 子查询
select id from users where role_id=2如果返回多条记录会触发运行错误,建议加LIMIT 1或者改用EXISTS写法避免该问题 - 触发器名包含横杠
-,需要用反引号包裹避免语法解析错误
- 你提供的
修复后的完整代码
-- 先确认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
相关产品推荐
相关产品推荐

