vlambda博客
学习文章列表

MySQL的触发器使用总结

   




  

  触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。


在MySQL中,创建触发器语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt


其中:

trigger_name:标识触发器名称,用户自行指定;

trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;

trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;

tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;

trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER 、DELETE。

另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。

一、MySQL触发器的应用案例-1


/*创建account表*/

CREATE TABLE account

(

acct_num INT,

amount DECIMAL(10,2)

);

/*创建myname表*/

CREATE TABLE myname(

id int(11) DEFAULT NULL,

name char(20) DEFAULT NULL

);

要求:在向表account新增数据后,便会触发myname表新增一条记录1 ,'after insert'

CREATE TRIGGER trig_insert AFTER INSERT ON account

FOR EACH ROW INSERT INTO myname VALUES (1,'after insert');

二、MySQL触发器的应用案例-2

有如下2张表:

CREATE TABLE `tab1` (

`tab1_id` varchar(11) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

insert into `tab1`(`tab1_id`) values ('aaa'),('bbb'),('222'),('333');

CREATE TABLE `tab2` (

`tab2_id` varchar(11) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

insert into `tab2`(`tab2_id`) values ('222'),('333');


要求:删除tab1表记录后自动将tab2表中对应的记录删去

DELIMITER //

CREATE TRIGGER test1

AFTER DELETE ON tab1

FOR EACH ROW

BEGIN

DELETE FROM tab2 WHERE tab2_id=old.tab1_id;

END

//

DELIMITER ;

三、MySQL触发器的应用案例-3

建立一个商品表和商品日志表,在删除商品的同时在商品日志表新增一条删除的记录

CREATE TABLE `commodity` (

`c_id` varchar(20) DEFAULT NULL,

`c_name` varchar(20) DEFAULT NULL,

`c_num` int(11) DEFAULT NULL,

`c_price` float DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

CREATE TABLE `commodity_log` (

`c_id` varchar(20) DEFAULT NULL,

`c_name` varchar(20) DEFAULT NULL,

`c_num` int(11) DEFAULT NULL,

`c_price` float DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

CREATE TRIGGER trigger_commodity AFTER DELETE ON commodity

FOR EACH ROW

INSERT INTO commodity_log VALUES(old.c_id,old.c_name,old.c_num,old.c_price);

在执行删除操作

DELETE FROM commodity

查看日志表

SELECT * FROM commodity_log

四、MySQL触发器的应用案例-4

有如下表:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

要求:创建一个单执行语句的触发器

/*创建触发器*/

CREATE TRIGGER ins_sum BEFORE INSERT ON account

FOR EACH ROW SET @sum = @sum + NEW.amount;

/*调用触发器*/

SET @sum =0;

INSERT INTO account VALUES(1,1.00), (2,2.00);

/*查看触发器调用后的结果*/

SELECT @sum;

五、MySQL触发器的应用案例-5


设有4个测试数据表:

CREATE TABLE test1(a1 INT);

CREATE TABLE test2(a2 INT);

CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE test4(

a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

b4 INT DEFAULT 0

);

要求:创建一个包含多个执行语句的触发器


/*创建触发器*/

DELIMITER //

CREATE TRIGGER testref BEFORE INSERT ON test1

FOR EACH ROW BEGIN

INSERT INTO test2 SET a2 = NEW.a1;

DELETE FROM test3 WHERE a3 = NEW.a1;

UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;

END

//

DELIMITER ;

/*分别向test3和test4表中插入测试数据*/

INSERT INTO test3 (a3)

VALUES (NULL), (NULL), (NULL), (NULL), (NULL),

(NULL), (NULL), (NULL), (NULL), (NULL);

INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

/*向test1表中插入数据,激活触发器的调用事件调用触发器*/

INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);

/*查看触发器执行后的结果*/

SELECT * FROM test1;

SELECT * FROM test2;

SELECT * FROM test3;

SELECT * FROM test4;

六、MySQL触发器的应用案例-6

通过SHOW TRIGGERS命令查看一个触发器

/*创建myname表*/

CREATE TABLE myname(

id int(11) DEFAULT NULL,

name char(20) DEFAULT NULL

);

/*创建触发器*/

CREATE TRIGGER trig_update AFTER UPDATE ON account

FOR EACH ROW INSERT INTO myname VALUES (1,'after update');

/*查看触发器信息*/

SHOW TRIGGERS \G;

七、MySQL触发器的应用案例-7

创建一个在account表更新之后,更新myname数据表的触发器

/*创建触发器*/

CREATE TRIGGER trig_insert AFTER INSERT ON account

FOR EACH ROW INSERT INTO myname VALUES (2,'after insert');

/*激活触发器*/

INSERT INTO account VALUES (1,1.00), (2,2.00);

/*查看触发器执行后的结果*/

SELECT * FROM myname;