MySQL5.7环境下phpMyAdmin执行触发器语句报语法错误求解
问题排查结果
你的代码在MySQL 5.7下存在多个语法不兼容和逻辑错误,具体如下:
- 不支持
CREATE OR REPLACE TRIGGER语法:该特性是MySQL 8.0.19版本才新增的,5.7版本没有相关实现,需要先执行DROP TRIGGER IF EXISTS [触发器名]删除旧触发器,再执行CREATE语句创建新触发器。 - 不支持多触发事件绑定:MySQL的触发器不支持
AFTER INSERT OR UPDATE OR DELETE这种同时绑定多个触发事件的写法,单个触发器只能绑定一个触发事件,你需要分别创建INSERT、UPDATE、DELETE三个独立的触发器。 - reserveringId取值逻辑错误:DELETE操作中只有
OLD对象可用,INSERT操作中只有NEW对象可用,直接写NEW.reserveringId OR OLD.reserveringId会出现空值,需要根据触发事件分支判断取值。 - 遗漏分号语法错误:
SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId )语句末尾缺少分号,会直接触发SQL解析报错。
修复示例(以INSERT触发器为例)
-- 先删除已存在的同名触发器 DROP TRIGGER IF EXISTS update_counts_insert_trigger; DELIMITER // CREATE TRIGGER update_counts_insert_trigger AFTER INSERT ON tickets FOR EACH ROW BEGIN DECLARE V_uitvoeringId, V_ReserveringId varchar(50); DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int; -- INSERT场景取NEW的值 SET V_ReserveringId = NEW.reserveringId; SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId ); SET V_tekoop = ( SELECT count(*) FROM tickets t WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId); SET V_gereserveerd = ( SELECT count(*) FROM tickets t WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId); SET V_wachtlijst = ( SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId); UPDATE uitvoering SET tekoop = V_tekoop, gereserveerd = V_gereserveerd, wachtlijst = V_wachtlijst, vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop WHERE id=V_uitvoeringId; END // DELIMITER ;
UPDATE和DELETE触发器只需要修改触发事件定义和V_ReserveringId的取值逻辑即可:
- UPDATE场景可按需取
NEW.reserveringId或OLD.reserveringId - DELETE场景取值改为
SET V_ReserveringId = OLD.reserveringId
执行注意事项
在phpMyAdmin中执行时,需要先确认界面上的分隔符设置为//再执行触发器创建语句,避免因为默认分隔符;截断SQL导致解析错误。
内容的提问来源于stack exchange,提问作者haayman
相关产品推荐
相关产品推荐

