繁体   English   中英

MySQL语法错误与触发器

[英]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

如果发生冲突,我该如何退回更改

触发器中不允许Rollbackcommit
相反,您可以通过在条件失败时设置特定的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM