我正在尝试创建这个 mysql 触发器:
DELIMITER //
CREATE TRIGGER checkcollision2 AFTER UPDATE ON projectiles p1
FOR EACH ROW
BEGIN
IF (SELECT count(*) FROM players p WHERE p.wolf=1 AND NEW.x>=p.x AND NEW.x<=p.x+25 AND NEW.y>=p.y AND NEW.y<=p.y+25) > 0 THEN
DELETE FROM projectiles p2 WHERE p1.id=p2.id;
END IF;
END;//
DELIMITER ;
但这行不通,因为它出现语法错误。我不确定是不是因为我为表使用了别名。我这样做是因为,如果 if
语句为真,那么我想删除触发器启动的当前更新行。我想我可以通过从同一个表中执行删除来做到这一点,其中 ID 相同,但如果我不使用别名,那么该表中的所有行都将被删除。
有人看到这里出了什么问题吗?
最佳答案
不支持触发器签名级别标识的别名,因此不正确。
相反,如果需要,您可以在触发器主体中定义别名。
当您想根据条件执行删除
操作时,您可以使用NEW
来与特定的行-列值进行比较。当前的 where 子句 WHERE p1.id=p2.id
将从表中删除 ALL 行,这是不安全的。
如下更改触发器定义:
DELIMITER //
DROP TRIGGER IF EXISTS checkcollision2 //
CREATE TRIGGER checkcollision2 AFTER UPDATE ON projectiles
FOR EACH ROW
BEGIN
DELCARE match_count INT DEFAULT 0;
SELECT count(*) INTO match_count
FROM players p
WHERE p.wolf = 1
AND NEW.x BETWEEN p.x AND ( p.x + 25 )
AND NEW.y BETWEEN p.y AND ( p.y + 25 )
IF match_count > 0 THEN
DELETE FROM projectiles WHERE id = NEW.id;
END IF;
END;
//
DELIMITER ;
关于mysql - 如何在 mysql 触发器中使用别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440006/