博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 触发器(trigger)
阅读量:5876 次
发布时间:2019-06-19

本文共 2589 字,大约阅读时间需要 8 分钟。

触发器(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_table1after insert  on table1for each rowbegininsert 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_table1after delete on table1for each ROWbegindelete 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_table1after update on table1for each ROWbeginupdate 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_table3before insert on table3for each row set @sum=@sum+new.num;

执行触发器

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

 

转载于:https://www.cnblogs.com/sztx/p/9499769.html

你可能感兴趣的文章
电子政务方向:We7.Cloud政府云门户
查看>>
虚拟机Centos7连接Internet
查看>>
ansible 基本操作(初试)
查看>>
更改tomcat的根目录路径
查看>>
51nod 1292 字符串中的最大值V2(后缀自动机)
查看>>
加快ALTER TABLE 操作速度
查看>>
学习笔记之软考数据库系统工程师教程(第一版)
查看>>
基本网络概念
查看>>
将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1 RC 1
查看>>
js提交图片转换为base64
查看>>
学习CodeIgniter框架之旅(二)继承自定义类
查看>>
Y2161 Hibernate第三次考试 2016年8月18日 试卷分析
查看>>
Angular CLI 使用教程指南参考
查看>>
PHP 程序员的技术成长规划
查看>>
用于守护进程的出错处理函数
查看>>
AppCan可以视为Rexsee的存活版
查看>>
【转】SQL SERVER 2005 数据库状态为“可疑”的解决方法
查看>>
事件、委托、委托方法的总结(使用EventHandler<>)
查看>>
Revit API 创建带箭头的标注
查看>>
jetty启动报错Unsupported major.minor version 51.0
查看>>