[英]Mysql syntax error with trigger
我有这个触发
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 ;
您可能没有更改DELIMITER
我怎么做?
使用DELIMITER
命令,如下所述
在创建触发器或过程时,更改定界符很重要,因为否则,在触发器主体内使用分号语句定界符(例如,在SELECT语句的末尾)相对于分号末尾的分号是模棱两可的CREATE TRIGGER语句。
对于MySQL开发人员来说,这是一个非常常见的困惑源。
编辑1 :
如果发生冲突,我该如何退回更改
触发器中不允许Rollback
, commit
。
相反,您可以通过在条件失败时设置特定的sqlstate
来发出signal
。
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操作等操作。
相应地更改身体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.