码迷,mamicode.com
首页 > 数据库 > 详细

mysql触发器总结

时间:2015-06-23 12:06:14      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该触发器。比如当相应的数据表被INSERT\DELETE或UPDATE语句修改时,触发器将自动执行。触发器可以被设置成在这几种语句处理每个数据行之前或之后触发。对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。

触发器优点:

  • 触发器可以检查或修改即将被插入或修改的数据,对输入数据进行必要的过滤,或强制检查数据是否合法,比如员工的年龄是不是大于18,而小于60岁,不在这个范围就不插入或修改。
  • 当数据删除或修改时,触发器检查它当前的内容。比如某员工离职时,将删除相应的该员工记录,用触发器把相应的记录插入历史记录表。
  • 触发器可以把表达式的结果赋值给数据列作为其默认值。


语法格式:
CREATE TRIGGER trigger_name    #触发器名称
{BEFORE | AFTER}        #什么时候触发
{INSERT | UPDATE | DELETE}    #触发的操作事件
ON table_name            #触发相关联的表
FOR EACH ROW trigger_stmt;    #当触发程序激活时执行的语句



 INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

 UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。


举例:

创建表

[sql]  view plain copy
  1. CREATE TABLE `employee` (  
  2.   `id` int(11) NOT NULL auto_increment,  
  3.   `namevarchar(255) NOT NULL,  
  4.   `age` int(11) NOT NULL,  
  5.   `createTime` datetime NOT NULL,  
  6.   PRIMARY KEY  (`id`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

创建添加触发器
[sql]  view plain copy
  1. DELIMITER ;;  
  2. CREATE TRIGGER `employee_tri`  
  3. BEFORE INSERT   #插入前触发  
  4. ON `employee`  
  5. FOR EACH ROW  
  6. begin  
  7.     #createTime为系统当前时间  
  8.     set new.createTime=current_timestamp;  
  9.     if new.age<17 then  
  10.         #年龄小于17,将设为17  
  11.         set new.age=17;      
  12.     elseif new.age>65 then  
  13.         #年龄大于65,将设为65  
  14.         set new.age=65;  
  15.     end if;  
  16. end;;  
  17. DELIMITER ;  

运行结果:


[plain]  view plain copy
  1. mysql> insert into employee(name,age,createTime) values(‘linchunda‘,13,‘1990-06-12‘);  
  2. Query OK, 1 row affected (0.03 sec)  
  3.   
  4. mysql> select * from employee;  
  5. +----+-----------+-----+---------------------+  
  6. | id | name      | age | createTime          |  
  7. +----+-----------+-----+---------------------+  
  8. |  1 | linchunda |  17 | 2013-08-01 21:32:14 |  
  9. +----+-----------+-----+---------------------+  
  10. 1 row in set (0.00 sec)  
想插入年龄小于17的都不行,触发器自动置为17,创建时间自动为系统当前的时间


NEW.col_name   表示插入数据的值,或修改后的值。

OLD.col_name修改或删除它之前的值。

提示:如果是Ms SQL Server分别保存在inserted表、deleted表


创建删除触发器

删除一条记录后,将在history表添加一条相应的记录


[sql]  view plain copy
  1. #创建history表,该表结构和employee一样,但没有数据,因为没有id=-1的记录  
  2. CREATE TABLE HISTORY SELECT * FROM employee where id=-1;  
  3.   
  4. DELIMITER ;;  
  5. CREATE TRIGGER `employee_tri_del`  
  6.   
  7. BEFORE DELETE   #删除前触发  
  8.   
  9. ON `employee`  
  10. FOR EACH ROW  
  11. begin  
  12.  #把该条记录插入history表  
  13.  INSERT INTO HISTORY SELECT * FROM employee where id=OLD.id;  
  14. end;;  
  15. DELIMITER ;  

运行结果:
[sql]  view plain copy
  1. mysql> delete from employee where id =1;  
  2. Query OK, 1 row affected (0.03 sec)  
  3.   
  4. mysql> select * from history;  
  5. +----+-----------+-----+---------------------+  
  6. | id | name      | age | createTime          |  
  7. +----+-----------+-----+---------------------+  
  8. |  1 | linchunda |  17 | 2013-08-01 21:32:14 |  
  9. +----+-----------+-----+---------------------+  
  10. 1 row in set (0.00 sec)  
  11.   
  12. mysql> select * from employee;  
  13. Empty set (0.00 sec)  

删除语法

DROP TRIGGER trigger_name

[sql]  view plain copy
  1. DROP TRIGGER `employee_tri`;  
  2.    


在触发程序的执行过程中,MySQL处理错误的方式如下:

  •     如果BEFORE触发程序失败,不执行相应行上的操作。
  •     仅当BEFORE触发程序(如果有的话)和行操作均已成功执行,才执行AFTER触发程序。
  •      如果在BEFORE或AFTER触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。
  •     对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。


注:

mysql5.1.6版本之前,您必须要拥有SUPER权限,之后的版本因为触发器与一个数据表相关联,所以您必须拥有那个数据表的trigger权限才能为它创建和删除触发器。

mysql触发器总结

标签:

原文地址:http://my.oschina.net/liting/blog/469571

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!