19

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

例如:

表foo有一个属性叫做agent,agent属性只能是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 ;

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

4

2 回答 2

30

尝试信号语法 - 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

编辑

根据 Bill Karwin 下面的热门评论进行了更新。

于 2012-04-16T05:09:09.350 回答
5

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

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

于 2012-04-16T05:31:42.587 回答