带触发器的Mysql语法错误

时间:2014-04-29 18:22:22

标签: mysql triggers

我有这个触发器

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 ;

这仍然是语法错误...

enter image description here

这会出现语法错误:

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 ; 

enter image description here

2 个答案:

答案 0 :(得分:0)

你可能没有改变DELIMITER

  

我该怎么做?

使用DELIMITER命令,此处描述

在您创建触发器或过程时更改分隔符非常重要,因为否则在触发器主体内部使用分号语句分隔符(例如,在SELECT语句的末尾)是不明确的尊重CREATE TRIGGER语句末尾的分号。

这是MySQL开发人员非常常见的混淆源。

答案 1 :(得分:0)

修改1

  

如果发生碰撞,如何让它回滚更改

触发器中不允许使用

Rollbackcommit 相反,您可以通过在条件失败时设置特定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操作等。

相应地改变身体。