什么是触发器 trigger
触发器,顾名思义, 在遇到一定条件时就会触发,触发后执行一个或者一组sql语句的装置 。
比如在学生成绩表中,新增一门课的成绩后, 就修改该学生的绩点。 或者在银行卡消费之后, 就给户主发一条余额通知短信。
触发器的种类
触发器在指定表后, 可以在插入数据(insert),更新数据(update),删除数据(delete)这三个动作的前(before)后(after)触发 。因为触发器的种类有六种,分别是 插入前,插入后, 更新前,更新后, 删除前,删除后。
每个表每种触发器只能创建一次, 故每个表最多可以创建六个触发器。
触发器关键词 old ,new
这两个该关键字,表示触发的那一行在操作前和操作后的数据。
INSERT触发器中, NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据。
UPDATE触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据。
DELETE触发器中,OLD用来表示将要或已经被删除的原数据。
使用方法NEW.columnName(columnName为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用
如何创建触发器
创建触发器的语法为
CREATE TRIGGER trigger_name time event ON table_Name FOR EACH ROW
BEGIN
trigger_sql_list;
END
创建触发器, 在更新学生表之后, 记录该表格更新次数的变量加1。
mysql> SET @cuont_stu_update = 0 $
mysql> CREATE TRIGGER update_count AFTER UPDATE ON student FOR EACH ROW
-> BEGIN
-> SET @cuont_stu_update = @cuont_stu_update +1;
-> END$
Query OK, 0 rows affected (0.10 sec)
mysql> UPDATE student SET class ='1' WHERE s_num =101$
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @cuont_stu_update$ # 更新之前是0, 现在为1
+-------------------+
| @cuont_stu_update |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
查看触发器
删除触发器
mysql> DROP TRIGGER update_conut;
Query OK, 0 rows affected (0.03 sec)
触发器的优点
- 触发器的自动性,与一个操作相关的操作可以用触发器自动完成
- 触发器类似一个无参数的存储过程,操作会同时生效或失效,具有一致性。
触发器的缺点
- 触发器隐藏的,就在无形中增加了数据库的复杂性
- 触发是隐藏的,容易被忽略产生的效果
- 触发器隐藏的,数量较多时,给系统维护带来困难
所以触发器功能要注释清晰,不用时及时删除,任务繁杂时使用显示的存储过程,过程更清晰。