sql - MySQL 停止触发器中的事件

标签 sql mysql triggers

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

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

最佳答案

MySQL 使用 SIGNAL对于这样的事情:

SIGNAL is the way to “return” an error. SIGNAL provides error information to a handler, to an outer portion of the application, or to the client. Also, it provides control over the error's characteristics (error number, SQLSTATE value, message). Without SIGNAL, it is necessary to resort to workarounds such as deliberately referring to a nonexistent table to cause a routine to return an error.

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

我手头上只有 5.1,所以我无法验证 SIGNAL 内容。 “19.3.1.触发语法”的相关部分对于 5.1、5.2 和 5.5 来说是相同的,因此如果您需要诉诸此类东西,“触发错误”组合之一应该可以工作。

关于sql - MySQL 停止触发器中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055423/

相关文章:

SQL 以任意顺序选择类似关键字

php - 检查 session 并在可能进行 3 次 session 时更改菜单

MySQL - 如何将列转为行?

Mysql触发器不起作用

wpf - 如何根据 ViewModel 属性的值让 View 元素淡入/淡出?

mysql - SQL查询结果结构

Mysql查询返回基于同一表中多列的行

mysql - 如果 id 存在于另一个表中,则将列选择为 true/false

php - 如何将数据从一张表移至 MySQL (MariaDB) 中的 EAV 结构

带触发器的 WPF 设计时与运行时样式差异