我正在使用mysql 5.1.72-0ubuntu0.10.04.1 (Ubuntu)。我想创建一个触发器,以防止玩家和墙之间的碰撞。
玩家和墙表都有x和y列。
我有以下触发器:
玩家和墙表都有x和y列。
我有以下触发器:
CREATE TRIGGER checkcollision AFTER UPDATE ON players BEGIN
SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y;
END;
我想知道如果有任何实际选择的行,这个触发器是否会回滚更新,考虑到我的mysql版本。还是我必须手动回滚?
此外,我的触发器存在语法问题,我不确定是什么问题。
有人知道吗?
编辑:
我认为我需要从这里获取旧的语法:https://dev.mysql.com/doc/refman/5.0/en/commit.html
但我不知道如何完成代码...
START TRANSACTION;
SELECT p.* FROM players p WHERE EXISTS (SELECT w.* FROM walls w WHERE w.x=p.x AND w.y=p.y);
COMMIT;
ROLLBACK;
编辑2:
出现语法错误:
DELIMITER //
CREATE TRIGGER checkcollision AFTER UPDATE ON players
FOR EACH ROW
BEGIN
IF (SELECT count(*) FROM walls WHERE NEW.x=x AND NEW.y=y)>0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Collision detected';
END IF;
END;//
DELIMITER ;