创建MySQL触发器时触发#1064语法错误,请求排查解决
解决MariaDB触发器的1064语法错误
嘿,我来帮你搞定这个触发器的语法问题!你遇到的1064错误是几个细节没处理对,我给你一一拆解:
错误原因分析
- DECLARE位置错误:MariaDB要求所有
DECLARE语句必须放在触发器BEGIN块的最开头,你之前把它放在了BEGIN外面,这直接触发了语法错误。 - 缺少
FOR EACH ROW子句:触发器必须明确指定对每一条插入的行执行逻辑,这个子句是必不可少的核心语法。 - 引用新数据的方式错误:在
AFTER INSERT触发器里,要访问刚插入的记录字段,得用NEW关键字(比如NEW.il),而不是直接用表名uber。 - 变量赋值语法错误:给变量赋值必须用
SET关键字,不能直接写temp=xxx,这不符合MariaDB的变量赋值规则。 - 语句分隔符冲突:触发器内部有多个分号,默认的分号分隔符会让数据库提前终止触发器定义,所以需要先临时修改分隔符。
修正后的完整代码
DELIMITER // CREATE TRIGGER hesap AFTER INSERT ON uber FOR EACH ROW BEGIN DECLARE temp INT; IF NEW.il = 'ANKARA' THEN SET temp = 5 + (NEW.mesafe * 0.5); ELSEIF NEW.il = 'ISTANBUL' THEN SET temp = 10 + (NEW.mesafe * 0.5); ELSEIF NEW.il = 'IZMIR' THEN SET temp = 3 + (NEW.mesafe * 0.5); END IF; INSERT INTO fatura VALUES(NEW.uid, temp); END // DELIMITER ;
代码说明
- 先用
DELIMITER //把SQL分隔符临时改成//,避免触发器内部的分号被误判为整个语句的结束。 - 添加
FOR EACH ROW,确保每插入一行就执行一次触发器逻辑。 - 把
DECLARE temp INT移到BEGIN块的最开头,严格遵守语法规范。 - 用
NEW.字段名替代uber.字段名,正确引用新插入的记录数据。 - 用
SET关键字给temp变量赋值,符合MariaDB的变量赋值语法要求。 - 每个语句结尾都加上分号,最后用
//结束触发器定义,再把分隔符改回默认的;。
内容的提问来源于stack exchange,提问作者Berk Can
相关产品推荐
相关产品推荐

