阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL触发器(trigger)

114次阅读
没有评论

共计 2376 个字符,预计需要花费 6 分钟才能阅读完成。

触发器(trigger):监视某种情况,并触发某种操作。

触发器创建语法四要素:1. 监视地点(table) 2. 监视事件(insert/update/delete) 3. 触发时间(after/before) 4. 触发事件

语法:

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 可以是下述值之一:

insert:将新行插入表时激活触发程序,例如,通过 insert、load data 和 replace 语句。

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

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

要注意,trigger_event 与以表操作方式激活触发程序的 SQL 语句并不很类似,这点很重要。

例如: 关于 insert 的 before 触发程序不仅能被 insert 语句激活,也能被 load data语句激活。

create trigger triggerName

after/before insert/update/delete on 表名

for each row   #这句话在 MySQL 是固定的

begin

sql 语句;

end;


 

对于 insert 语句, 只有 new 是合法的;

对于 delete 语句,只有 old 才合法;

对于 update 语句,newold可以同时使用。


 

创建表(触发器要操作的两张表)

/*auto_increment:自增;priamry key:主键;comment: 注释 */

/* drop:删除;if exists xxx(判断 xxx 名在数据库时候是否出存在 xxx 名称)*/

/* for each row : 循环一行一行的执行数据 */

/* after insert/update/delete on table_name : 针对哪个表执行的 insert/update/delete 操作 */

 
drop table if exists table1;

create table table1(id int(4) primary key auto_increment not null comment 'id',
name varchar(225) comment '名字'
);

drop table if exists table2;
create table table2(id int primary key auto_increment not null comment 'id',
name varchar(225) comment '名字'
);
 

Before 与 After 区别:

before:(insert、update)可以对 new 进行修改,after 不能对 new 进行修改,两者都不能修改 old 数据。

insert 触发器

drop trigger if exists insert_on_table1;
create trigger insert_on_table1
after insert  on table1
for each row
begin
insert into table2(name) value(new.name);
end

操作触发器

insert table1(name) value('aaa');

查询 table2 是否有值

select * from table2;

delete 触发器

drop trigger if exists delete_on_table1;
create trigger delete_on_table1
after delete on table1
for each ROW
begin
delete from table2 where name=old.name;
end

执行删除操作

delete from table1 where id=1;

查询 table2 变化

select * from table2;

更新 table1 更新触发器

drop trigger if exists update_on_table1;
create trigger update_on_table1
after update on table1
for each ROW
begin
update table2 set name=new.name where name=old.name;
end

执行更新操作

update table1 set name='ccc';

查询 table2 变化

select * from table2;

 使用 before 统计插入积分例子:

创建表

drop table if exists table3;
create table table3(id int primary key auto_increment comment 'id',
num int  comment '积分'
)engine=myisam  default charset=utf8 comment='单独积分表';

创建用函数变量接收的触发器

drop trigger if exists insert_on_table3;
create trigger insert_on_table3
before insert on table3
for each row 
set @sum=@sum+new.num;

执行触发器

set @sum=0;
insert into table3 values(1,2),(2,3),(3,3),(4,3);
select @sum;

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-08/146248.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2376字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中