Mysql 使用触发器停止插入或更新
既然MySQL忽略了检查约束,那么如何使用触发器来阻止插入或更新的发生呢 例如: 表foo有一个名为agency的属性,agency属性只能是1、2、3、4或5Mysql 使用触发器停止插入或更新,mysql,triggers,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
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 ;
分隔符$$
创建触发机构检查
在foo上插入之前
每行
开始
如果(new.agency<1或new.agency>5),则
#什么也不做?
如果结束;
结束
$$
定界符;
或者有更好的方法在MySQL中执行检查约束吗?试试信号语法-
创建触发机构\u检查
在foo上插入之前
每行
开始
如果(new.agency<1或new.agency>5),则
信号SQLSTATE'45000'设置消息_TEXT='your error MESSAGE';
如果结束
结束
编辑
根据Bill Karwin下面的流行评论进行更新。如果您的MySQL版本早于5.5,请尝试将表的非空字段设置为空。这是一种黑客行为,但它确实阻止了更新或插入的完成
Naveen建议的SIGNAL命令看起来很棒,我期待在升级后使用它。我遇到了一种情况,设置非空字段并不能阻止插入。对我来说(在Mysql 5.0中——在信号可用之前)一直有效的是调用一个不存在的过程。我从中得到了使用CALL的技巧。这不是
信号的正确语法。它应该是SIGNAL SQLSTATE'45000'SET MESSAGE_TEXT='your error MESSAGE'代码>为什么不能为代理列使用enum
数据类型?
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