触发器可以让你在插入,更新、删除前后触发相应的事件
优点:触发器可以捕获业务逻辑中的错误,可以检查数据完整性,在执行命令前执行一些特定的操作,这个操作可以是逻辑语句,也可以是mysql语句
缺点:触发器不可见,它捕获的异常没那么容易想到是触发器的发出的,通常需要自定义异常,触发器越多或者越复杂,查看起来就越混越迷
作用:执行特定操作如一个表修改另一个表也要修改,和检查数据是否合格等
语法:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 #触发事件指:insert(有new) update(有new,old) delete(有old)
ON 表名 FOR EACH ROW
BEGIN
执行语句列表,可以存在多条sql语句,或逻辑语句
END
引入:delimiter #分隔符,原来mysql是以;作为结尾标志的,而delimiter可以修改结尾标志 ,一般改为$
创建触发器:假如插入一条学生记录,在插入之前判断sex性别是否是男或者女
mysql> delimiter $
#这里触发器命名我喜欢用这么长,一来可以知道是那个表,他是一个触发器,并在插入前执行
mysql> create trigger stu_trigger_before_insert before insert
-> on stu for each row
-> begin
-> if new.sex!='男' && new.sex!='女' #这里是插入有new方法
-> then
-> signal sqlstate 'HY000' set message_text='sex error';
#上面HY000指的是服务器类型错误,不一定非要用它,只是借用这个抛出自己提示的错误,也可以使用XT000等其他类型错误**
-> end if;
-> end;
-> $
Query OK, 0 rows affected (0.01 sec)
mysql> insert into stu values(1,‘lyf’,18,‘中性’);
ERROR 1644 (HY000): sex error
插入不合规格的就会报错,有时报错会乱码,因为服务器错误,所以你字符集没有设置为utf8,这里建议创建数据库的时候就设置
查看所有触发器
mysql> show triggers \G;
加上\G更方便查看当然你可以指定某个数据库中的触发器,
因为触发器都存在information_schema中,所以可以这么查看
mysql> select * from information_schema.triggers;
这样查询,自然可以使用where进行指定或者like模糊查询咯
删除触发器
mysql> drop trigger stu_trigger_before_insert;
注意:MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发,产生死循环,所以他一般用作逻辑判断,和对其他表做增删改
并且触发器不能返回select结果集。
这里的这个我只利用空余时间回忆了下,但是对于注意点记不太清,尝试的时候也出现了死循环,还找不到原因,代码的话我只上了简单的逻辑判断,sql语句只要不写select查询其他的ok,唯一要注意的是new,和old的使用,注意哪些事件有new,哪些有old就好了。