使用触发器停止插入或更新

Rya*_*yan 16 mysql triggers

由于MySQL忽略了检查约束,如何使用触发器来阻止插入或更新发生?

例如:

表foo有一个名为agency的属性,agency属性只能是1,2,3,4或5.

delimiter $$
create trigger agency_check
before insert on foo
for each row
begin
if (new.agency < 1 or new.agency > 5) then

#Do nothing?

end if;
end
$$
delimiter ;
Run Code Online (Sandbox Code Playgroud)

或者有没有更好的方法来在MySQL中进行检查约束?

Nav*_*mar 23

尝试使用SIGNAL语法 - https://dev.mysql.com/doc/refman/5.5/en/signal.html

create trigger agency_check
before insert on foo
for each row
begin
  if (new.agency < 1 or new.agency >5) then
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'your error message';
  end if 
end
Run Code Online (Sandbox Code Playgroud)

  • 这不是`SIGNAL`的正确语法.它应该是`SIGNAL SQLSTATE'45000'SET MESSAGE_TEXT ='你的错误信息';` (15认同)

bra*_*aks 5

如果您的 MySQL 版本早于 5.5,请尝试将表的非空字段设置为 NULL。这是一个黑客,但它确实阻止更新或插入完成。

Naveen 建议的 SIGNAL 命令看起来很棒,我期待在我们升级后使用它。

  • 我遇到了一种情况,即设置非空字段不会阻止插入。对我来说一直有效的(在 Mysql 5.0 中——在 SIGNAL 可用之前)是调用一个不存在的过程。[这个答案](http://stackoverflow.com/a/1643846/109581) 来自 [longneck](http://stackoverflow.com/users/94475/longneck) 是我得到使用 CALL 的提示的地方。 (2认同)