更新时间:2021-01-13 17:05:24 来源:极悦 浏览1010次
在我们正式学习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教程,体验全新的学习之旅。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习