天天看点

mysql总结9-------------触发器的学习

 1.概念:触发器是mysql响应insert、update、delete语句时自动执行的一条SQL语句。

  只有表支持触发器,视图是不支持触发器的。

2.触发器需要的信息:

<1>.唯一的触发器名称(一个表中的触发器名称唯一,而不是一个数据库中触发器名称唯一!

 即两个表可以有相同名称的触发器);   

<2>.触发器关联的表;

<3>.触发器应该响应的事件(insert、update、delete);

<4>.触发器何时执行(处理之前或者处理之后!) 

    故触发器分两种:前置触发器、后置触发器。

<5>.一个表的一个事件最后只有两个触发器(处理之前、处理之后),所以一个表最多有6个触发器。

<6>.如果响应之前的触发器执行失败,响应则不会执行。

      响应之前的触发器或响应执行失败,那么响应之后的触发器则不会执行。

4.insert事件的触发器:

#1.创建两个测试表  

USE mydb;  

#表1:t_tableA  

CREATE TABLE t_tableA(  

id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,  

val VARCHAR(20)  

);  

#表2:t_tableB  

CREATE TABLE t_tableB(  

#2.创建insert后置触发器  

CREATE TRIGGER tr_insert_tableA   /*tr_insert_tableA是触发器的名称*/  

AFTER INSERT ON t_tableA   /*一个后置在t_tableA表上的insert的触发器*/  

FOR EACH ROW  /*对所有代码行都执行*/  

INSERT INTO t_tableB(val) VALUES(new.val);  /*触发器的内容,将  

a表中插入的数据放到b表中一份,insert触发器会访问一个名称为new的虚拟表,获取刚插入的值*/  

/*测试一下上面的insert后置触发器*/  

INSERT INTO t_tableA(val) VALUES('ok');  

/*  

说明:  

①在insert触发器内,可引用一个名为new的虚拟表,访问被插入的行  

②在beforeInsert触发器中,new中的值也可以被更新(运行更改被插入的值)  

③对于自动增长列,new在insert执行之前的值为0,在执行之后是新的自动生成的值  

*/  

#第二个触发器:获得刚刚插入的自动生成的主键值  (注意:你应该把上面的一个触发器删掉再创建这个啊!!)  

CREATE TRIGGER t_insert_pk_tableA  

AFTER INSERT ON t_tableA  

FOR EACH ROW  

SELECT new.id INTO @id;  

/*测试一下*/  

INSERT INTO t_tableA(val) VALUES('no');  

SELECT @id;     

2.update事件的触发器:

#①在update触发器代码中,可以引用一个名为old的虚拟表访问以前的值,引用一个名为new的表访问新更新的值

#②在beforeupdate触发器中,new表中的值允许被更新(允许更改要用于update语句中的值);

#③old表的值都是只读的,不能更改的。

eg.创建一个触发器,将a表中修改后的名字都更改为大写!! 

DELIMITER // 

CREATE TRIGGER t_update_tableA 

BEFORE UPDATE ON t_tableA 

FOR EACH ROW 

BEGIN 

SET new.val = UPPER(new.val);  /*so important!!*/ 

END // 

DELIMITER ; 

测试一下上面的触发器: 

UPDATE t_tableA SET val='xyz' WHERE id=1; 

3.delete事件的触发器:

①在delete触发器代码中,可以引用一个old的虚拟表,访问被删除的行。

②old表中的值全部是只读的,不能更新的!!

/*把从a表删除的数据,插入到b表中,可以作为备份用!*/ 

CREATE TRIGGER t_delete_tableA 

AFTER DELETE ON t_tableA  

INSERT INTO t_tableB(val) VALUES(old.val); 

/*测试一把:*/ 

DELETE FROM t_tableA WHERE id=1; 

4.触发器的删除:drop trigger tr_insert_tableA;(tr_insert_table是触发器名)

5.说明性的东西:

<1>.从我上面的三个例子,你可以发现,delimiter //,以及begin,end //不是必须的东西;写与不写影响不大。

<2>.由于这玩意在开发用的比较少,我这里只说了最基本的应用。以后需要了咱们再接着补充吧!

     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/926550,如需转载请自行联系原作者