触发器的用途1
利用触发器检查输入数据的合理性 利用触发器维护冗余数据查看触发器
一、为什么使用触发器
触发器(TRIGGER)是MySQL的与表的insert,delete,update语句相关的数据库对象之一,当表上出现特定事件时,比如当对一个表进行操作(insert,delete,update)时, 将激活该对象, 就会自动执行。该对象与编程语言中的函数非常类似,都需要声明、执行等。
触发器(trigger)中定义了一系列操作,这一系列操作被称为是触发程序。触发器是个特殊的存储过程,触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现自动执行。触发器基于一个表定义,但可以引发在多个表上发生一系列自动操作。
在具体应用中,之所以会经常使用触发器数据库对象,是由于该对象能够加强数据库表中数据的完整性约束和业务规则等。
从MySQL 5软件开始才开始支持触发器数据库对象,所以触发器的使用说明适用于MySQL 5或更高级的版本。
触发器(trigger)的执行不是由程序调用,也不是手工启动,而是由事件来触发而自动执行的,比如当对一个表进行操作(insert,delete, update)时就会激活它自动执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS,USER_TRIGGERS 数据字典中查到。
触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。这就像是闯关游戏,闯过一关,再闯下一关,如果有一关没闯过就要从第一关开始。触发器与此类似,即触发程序视为单一交易中的一部分,因此可以由原触发程序还原交易,如果在交易过程中侦测到严重的错误(如使用者中断连线等),则会自动还原整个交易。其作用即是可以保证数据的完整性,或复杂代码的编写简化。
二、创建触发器
1.创建只有一条执行语句的触发器
语法形式:
Create trigger 触发器名称 before|after 激活事件 on 表名 for each row 触发事件 ;
Ø before|after说明触发器执行的时间,即说明触发程序是在激活语句之前或之后执行。before 指的是触激活事件之前先执行触发程序语句然后再执行激活事件,after 指的是激活事件之后执行触发程序语句。
Ø 触发器必须有名字,最多64个字符,可能后面会附有分隔符。它和MySQL中其他对象的命名方式基本一样.
Ø 激活事件,即触发器执行条件,是delete、insert 或 update之一.
INSERT操作:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA语句。
UPDATE操作:更改某行时激活触发程序,例如,通过UPDATE语句和REPLACE语句。
DELETE操作:从表中删除某一行时激活触发程序,例如,通过DELETE语句。
Ø 表名 表示激活事件发生的表的名称。触发程序与此表相关。此表名必须引用永久性物理表,不能将触发程序与视图或TEMPORARY表关联起来。
Ø for each row 表示行级触发器,即对任何一条记录的操作如果满足激活事件, 都会触发该触发器。
Ø 触发事件 表示激活触发器后被自动执行的语句. 如果执行多个语句, 可以使用BEGIN … END复合语句结构。
2.创建包含多条执行语句的触发器
如果当触发程序激活时执行的语句有多个,则可使用BEGIN …END复合语句结构。
语法形式:
create trigger 触发器名称 before|after 激活事件 on 表名 for each row begin 一系列触发事件 end
注:由于“一系列触发事件”中有多个执行语句,这些语句每条都会用默认的分号作为结束符,所以整个create trigger语句就不能分号结束了,此时需要声明最终的结束符,在create trigger语句之前,单独用delimiter来声明新的结束符。如delimiter
Begin与end之间的一系列触发事件表示所要执行的多个执行语句的内容,将每条执行语句用“;”结束。
问题:此时“;”表示每条执行语句的结束,就不能表示整个建触发器的语句的结尾。那么如何区分每条执行语句的结束与表示整个创建触发器的语句的结尾?可以用delimiter来声明最终的结束符。
对于在同个表上创建的触发器,具有相同激活事件的,不能有两个同样的时间。必要时可以有一个是before,一个是after。
触发器的优点
1,触发器的“自动性”。
对其他程序员来说,触发器是看不到的,但是的确存在,如果不用触发器的话,更新了某表的某字段时,还要写代码去更新其他表里面的冗余字段,如果是几张表都有冗余字段时,自动操作就很方便。
2,触发器的数据完整性
触发器有回滚性,就是一共要更新五张表的数据时,不会出现更新了二个张表,而另外三张表没有更新的情况。即要执行就五个表都执行,否则即使中途出错,也都复原数据。
但是如果是用php代码去写的话,就有可能出现更新了二张表的数据,这个时候,数据库运行出错,就会有的更新了,有的没更新。这样页面显示不一致了,会很槽糕。
三、触发器的应用一
- 利用触发器检查输入数据的合理性
输入数据时,检查数据的合理性,只能通过触发器来实现。 - 利用触发器维护冗余数据
四、查看触发器
1.通过SHOW TRIGGERS 语句查看触发器
语句为:SHOW TRIGGERS \G
会显示一个列表,显示出当前数据库中已经创建的所有触发器的信息。包括名称、触发事件、触发事件所操作的表、激活触发器的执行语句等.
2.通过查看系统库information_schema实现查看所有数据库中的各自的触发器
use information_schema;
select * from TRIGGERS\G
3.通过查看系统库information_schema实现查看触发器还可以查看某个触发器的详细信息.
语句为:use information_schema;
select * from TRIGGERS Where TRIGGER_name= “tri_diarytime2” \G
4.通过查看系统库information_schema实现查看触发器triggers
use information_schema;
desc TRIGGERS;
五、删除触发器
通过DROP TRIGGER语句删除触发器 drop TRIGGER 触发器名称;
触发器的用途二
只有存储引擎是InnoDB类型的数据表,才能作为主表支持外键功能,可以实现外键约束,当主表中执行update和delete操作时,可以通过在外键中设置“on delete 外键级联选项”或“on update 外键级联选项”,实现在主表中执行update和delete操作时分别在子表中做相应变动。外键约束关系就可以由InnoDB存储引擎自动维护。
外键级联选项cascade、set null或者no action(或restrict)的含义:
Ø CASCADE:当主表中的主键(被某表关联了外键)的字段值被update或delete时, 分别会同步update或delete子表的匹配的外键值.
Ø set null:当主表中的主键(被某表关联了外键)的字段值被update或delete时,分别将子表上相匹配的外键列值自动设置为null值. 此时要注意建立子表时外键列不能设非空not null约束.
Ø RESTRICT与no action相同,即不进行任何操作.即,如果子表中有匹配的记录,则不允许对父表中对应外键关联列做update或delete操作.
下面的情况中可以利用触发器实现数据级联选项
- 对于InnoDB类型的存储引擎的数据表,如果没有设置在主表中执行update和delete操作时的外键级联选项cascade、setnull或者no action(或restrict),则外键约束关系就不能由InnoDB存储引擎来自动维护,此时可以通过触发器来实现级联选项,达到外键约束关系的自动维护。
- 对于主表是MyISAM类型的存储引擎的数据表,不支持外键功能,此时就不可能通过设置级联选项的方式实现主表与子表之间数据的级联反应。此时可以通过触发器来实现数据级联。
1.用触发器实现表间删除数据的联动
2. 用触发器实现表间更新数据的联动