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

标签 mysql triggers alias

我正在尝试创建这个 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/

相关文章:

安卓-FragmentStatePagerAdapter : trigger swipe manually/disable swipe

Mysql - 坚持所有行的单行值?

php - 在需要从数据库中获取数据的循环中显示 div

mysql - Innodb 显示不正确的计数(id)

sql - 创建仅在创建新表时运行的触发器

sql - 在 ORACLE 中插入触发器

php - Mysql 查询应该产生结果,但没有

mysql - Mac OS SQL Server 需要安装吗?

namespaces - Rake 命名空间别名

java - 如何为私有(private)内部类创建别名(使用 XStream)?