MySQL在触发器中停止事件

时间:2011-02-20 05:30:01

标签: sql mysql triggers

如何在触发器中停止Event。例如:我在下面有这个简单的代码:

CREATE TRIGGER checkPlayer BEFORE INSERT ON players

BEGIN

  DECLARE ctr INT;

  SELECT count(*) 
    INTO ctr 
    FROM players 
   WHERE fName = NEW.fName 
     AND lName = NEW.lName;

  IF ctr > 0 THEN
    -- LEAVE and don't insert because player exists
  END IF;

END

2 个答案:

答案 0 :(得分:1)

MySQL使用SIGNAL来做这些事情:

  

SIGNAL是“返回”错误的方法。 SIGNAL向处理程序,应用程序的外部部分或客户端提供错误信息。此外,它还提供对错误特征(错误号,SQLSTATE值,消息)的控制。如果没有SIGNAL,就必须采用诸如故意引用不存在的表之类的解决方法来使例程返回错误。

任何error conditional in a BEFORE trigger(包括AFAIK,适当的SIGNAL值)都将中止触发器和触发触发器的语句。如果您的MySQL版本不支持SIGNAL(即您的版本小于5.5),那么您将不得不以另一种方式触发错误,例如旧的“从不存在的表中选择”hack或"violate a PK by a double INSERT"黑客。

我只有5.1方便,所以我无法验证SIGNAL的东西。 “19.3.1。触发器语法”的相关部分对于5.1,5.2和5.5是相同的,但是如果你需要诉诸这样的话,那么“触发错误”kludges之一就应该有效。

答案 1 :(得分:1)

我有一个迷你博客文章,用示例代码解释信号。点击here。另外,不是通过插入具有相同主键的两个条目来生成异常,而是还可以使用除以0的异常,该异常不涉及到数据库中的插入语句。