1

我正在尝试设置一个 MySQL 触发器,但我无法弄清楚如何准确地完成我想要完成的工作。我想我需要设置一个 MySQL @variable 但我尝试过的方法没有奏效,而且我无法找到一个好的资源来解决它。我更改了phpMyAdmin中的分隔符,实际查询中没有使用下面的注释。

CREATE TRIGGER coroner AFTER INSERT ON events
FOR EACH ROW BEGIN
UPDATE teams SET live = live-1 WHERE id = NEW.victim;
UPDATE teams SET score = score+NEW.value WHERE id = NEW.shooter;
UPDATE teams SET last_active = NEW.time WHERE id = NEW.shooter OR id = NEW.victim;
// up to here all works fine
IF (SELECT live FROM teams WHERE id = NEW.victim) = 0 THEN
UPDATE teams SET slot = slot-1 WHERE slot > OLD.slot;
ENDIF;
END

我在这里实际上是把一个团队排成一个圆圈,当团队的最后一个球员被淘汰时,我会在没有它的情况下关闭圆圈。

这是来自 phpMyAdmin 的错误消息:

#1363 - INSERT 触发器中没有 OLD 行

谢谢你的帮助


新尝试:

CREATE TRIGGER coroner AFTER INSERT ON events
FOR EACH ROW BEGIN
UPDATE teams SET live = live-1 WHERE id = NEW.victim;
UPDATE teams SET score = score+NEW.value WHERE id = NEW.shooter;
UPDATE teams SET last_active = NEW.time WHERE id = NEW.shooter OR id = NEW.victim;
SET @pivot := (SELECT slot FROM teams WHERE id = NEW.victim);
IF (SELECT live FROM teams WHERE id = NEW.victim) = 0 THEN
UPDATE teams SET slot = slot+1 WHERE slot < @pivot;
ENDIF;
END

错误:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '; 附近使用的正确语法。END'在第 9 行

4

1 回答 1

1

触发语言中没有ENDIF关键字。改用END IF(其中有空格)。

您可以查看IFStatement的语法文档。

于 2010-01-20T05:26:07.883 回答