专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 详解MySQL触发器

详解MySQL触发器

更新时间:2021-01-13 17:05:24 来源:动力节点 浏览934次

在我们正式学习MySQL触发器之前,我们先来看看什么是触发器。触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL ,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。简单的说,触发器是存储SQL过程的一种特殊形式,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行。

 

在MySQL数据库中,触发器是由事件驱动的专用过程,由DBMS存储和管理。触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行;MySQL触发器能够有效保证数据的完整性,起到了对数据约束的作用。

 

创建MySQL触发器的语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。  触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。  

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

 

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

1.INSERT:将新行插入表时激活触发程序,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;

2.UPDATE:更改某一行时激活触发程序,可能通过 UPDATE 语句触发;

3.DELETE:从表中删除某一行时激活触发程序,可能通过 DELETE、REPLACE 语句触发;

请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

 

trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句。

1.创建一个单执行语句的触发器首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型)和amount字段(定义成浮点类型);其次创建一个名为ins_sum的触发器,触发的条件是向数据表account插入数据之前, 对新插入的amount字段值进行求和计算:

create table account(act_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;

 

2.创建有多个执行语句的触发器,语法如下:

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

示例如下:

use study;

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;

 

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);

 

insert into test1(a1) values

(1),(3),(1),(7),(1),(8),(4),(4);

 

select * from test1;

select * from test2;

select * from test3;

select * from test4;

 

执行结果显示,在向表test1插入记录的时候,test2、test3、test4都发生了变化。从这个例子看insert触发了触发器,向表test2中插入test1的值,删除了test3中相同的内容,同时更新了test4中b4,即与插入的值相同的个数。

 

以上就是MySQL触发器的相关介绍,触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。尽管MySQL触发器功能强大,但由于我们的滥用会造成数据库及应用程序的维护困难,因此我们在MySQL数据库中还是要慎重使用。想要学习更多的MySQL数据库的相关知识,就来观看本站的MySQL教程,体验全新的学习之旅。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>