我有这个触发器
CREATE TRIGGER checkcollision AFTER UPDATE ON players BEGIN
SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y;
END;
mysql 5.1.72-0ubuntu0.10.04.1(Ubuntu)
但是我收到语法错误,我不知道在哪里......
编辑:
DELIMITER //
CREATE TRIGGER checkcollision AFTER UPDATE ON players BEGIN SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y; END//
DELIMITER ;
这仍然是语法错误...
这会出现语法错误:
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 ;
答案 0 :(得分:0)
你可能没有改变DELIMITER
我该怎么做?
使用DELIMITER
命令,此处描述
在您创建触发器或过程时更改分隔符非常重要,因为否则在触发器主体内部使用分号语句分隔符(例如,在SELECT语句的末尾)是不明确的尊重CREATE TRIGGER语句末尾的分号。
这是MySQL开发人员非常常见的混淆源。
答案 1 :(得分:0)
修改1 :
触发器中不允许使用如果发生碰撞,如何让它回滚更改
Rollback
,commit
相反,您可以通过在条件失败时设置特定signal
来提高sqlstate
。
IF ( condition_for_collision_true ) THEN
SET error_message = 'Invalid XYZ'; -- set proper message
-- set proper error state number
SIGNAL SQLSTATE <ERROR_STATE_NUMBER> SET message_text = error_message;
END IF;
这会导致交易中止。
原始回答:
每个受影响的行都会触发触发器。
你的触发器定义中缺少相同的内容。
DELIMITER //
CREATE TRIGGER checkcollision
AFTER UPDATE ON players
FOR EACH ROW
BEGIN
SELECT RAISE(ABORT, 'collision') FROM walls WHERE NEW.x=x AND NEW.y=y;
END;
//
DELIMITER ;
而且很明显。触发器不是常规例程。它们用于后台行动。您不能指望它们返回光标或任何其他结果。但是执行一项操作,例如设置或重置行中的值或其他相关表格上的任何DML操作等。
相应地改变身体。