Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用触发器停止插入或更新_Mysql_Triggers - Fatal编程技术网

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

Mysql 使用触发器停止插入或更新,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

既然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 ;
分隔符$$
创建触发机构检查
在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