如何在MySQL触发器中使用别名?

3

我正在尝试创建这个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相同来实现,但如果我不使用别名,那么将删除此表中的所有行。有人看到这里有什么问题吗?
1个回答

1
在触发器签名级别上不支持使用别名,因此是不正确的。
如果需要,可以在触发器主体内定义别名。

如果您想根据条件执行delete操作,则可以使用NEW与特定行列值进行比较。当前的where子句WHERE p1.id=p2.id将从表中删除所有行,这是不安全的。

请按以下方式更改触发器定义:

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 ; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接