mysql之触发器

作者:计算机知识

mysql手册

触发器(trigger)是SQL server 提要求程序猿和数目分析员来保险数据完整性的1种艺术,它是与表事件相关的特有的贮存进度,它的执行不是由程序调用,也不是手工业运维,而是由事件来触发,

始建触发器以前....

create database....
....
create table....
....

正文内容:

 

什么是触发器

创办触发器

  • 单条触发器语句
  • 多条触发器语句

查看触发器

去除触发器

触发器的新旧记录引用

 

首发日期:201捌-0肆-14

 


一、触发器

                           举个例子当对多少个表张开操作( insert,delete, update)时就能够激活它实践。触发器日常用来进步数据的完整性约束和事务规则等。 轻便讲触发器(trigger)正是监视某种景况,并触及某种操作。

创制触发器

什么是触发器:

 

  • 触发器用来在好几操作之后,“自动”实践一些操作。(举个例子插入了新的学生新闻,那么在班级表中应该修改学生数)。
  • 当insert delete update设置触发器之后,施行insert delete update操作就能自动触发设置的剧情。
  • 一张表最大能有陆个触发器(三*二,二种操作*三种时光(before|after))。

 

 


一、触发器(trigger)是壹种与表操作有关的数据库对象,该指标与编程语言中的函数极度周边,供给先申明后试行,并由事件来触发推行。

触发器成立语法肆要素:一.蹲点地点(table) 二.蹲点事件(insert/update/delete) 叁.接触时间(after/before) 4.触发事件(insert/update/delete)

固定格式

>delimiter //
>create trigger tirggerName
>after | before    insert | update | delete
>on triggerTableName for each row
>begin
>.....;    --一条或多条语句
>end;
>//
>delimiter ;

创办触发器:

 

mysql之触发器。语法:create trigger 触发器名 before|after 事件 on 表名 for each row 触发器语句;

  • 触发器名提出为trigger_xxx,这样有利于区分,触发器名不能够再次。
  • before|after 代表触发器语句试行时间,如若是before,正是在insert delete update操作从前推行触发器语句;after正是之后。
  • 事件就是insert delete update操作中的一个。
  • for each row 是意味着任何笔录试行相应操作都会触发器。
  • 触发器语句就是触发器触发时要实践的说话。
  • 举例:下边是2个当插入新用户时,在用户成立时间表中插入一条新数据,是这段时间光阴。
    create trigger trigger_addUserTime 
    before
     insert 
    on user_info 
    for each row 
    insert into usercreatetime(create_time) values(now());
    

 

 

create table user_info(
id int primary key auto_increment,
username varchar(20) not null,
password varchar(20) not null
)

create table usercreatetime(
id int primary key auto_increment,
create_time datetime
);

create trigger trigger_addUserTime before insert on user_info for each row insert into usercreatetime(create_time) values(now());

insert into user_info(username,password) values("admin","admin888");

select * from usercreatetime;

 

 

 

 

二、触发器结构构成

创建触发器:

种类

多条触发器语句情状:

须求将多条语句包裹在begin end中

  • 比如:图片 1

但要注意,上述情状适用于非命令行形式(上边是在navicat中运转的),如若要命令行中施行须求修改命令截至符(mysql命令暗中同意以“;”为语句停止符,假如我们不修改,那么键入一条触发器语句并以;甘休时就能够认为语句已经终结,然后就能因为语句不完全报错)【delimiter 自定义符号-- 有的时候修改语句结束符为内定符号】。

【将长逝符定义成$$就足以在触发器语句中应用;结束】

图片 2图片 3

 

 


CREATE TRIGGER trigger_name #触发器名
trigger_time #触发时机,取值为 BEFORE 或 AFTER
trigger_event #触发事件,取值为 INSERT、UPDATE 或 DELETE
ON tbl_name #建立触发器的表名,即在哪张表上建立触发器
FOR EACH ROW
trigger_stmt #触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句
//商品表
CREATE TABLE `g` (
`gId` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`num` int(4) NOT NULL,
PRIMARY KEY (`gId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
//订单表
CREATE TABLE `o` (
  `oId` int(4) NOT NULL AUTO_INCREMENT,
  `gId` int(4) NOT NULL,
  `much` int(4) NOT NULL,
  PRIMARY KEY (`oId`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
//插入数据
INSERT INTO `g` VALUES ('1', '商品1', '10');
INSERT INTO `g` VALUES ('2', '商品2', '10');
INSERT INTO `g` VALUES ('3', '商品3', '10');
//创建触发器
CREATE TRIGGER tg1
AFTER INSERT ON o
for EACH ROW
BEGIN
UPDATE g SET num=num-3 where gId=1;
END $
//执行 下订单
insert into o(gId,much) values(1,3)$
//删除 触发器 
drop trigger tg1 $

说明:
  当我们 下订单 购买商品1  3个时  
  执行 select * from g where gId=1
  会发现 num=7  
insert型
after insert 和 before insert两种

插入某一行时激活触发器,恐怕因而 insert语句触发

翻看触发器:

 

  • 使用show triggersG 查看全部触发器图片 4
  • 在数据库information_schema中通过查阅触发器表,来查阅触发器:使用select * from  triggersG;【当然能够以触发器名作为where条件查找数据】图片 5
  • 翻开触发器成立语句:show create trigger 触发器名G;

 

 


  注意:1)trigger_event中的INSERT包涵INSERT、LOAD DATA(用户赶快的向数据库中做批量mysql导入数据load data infile用法)和REPLACE(向表中插入多条记下,如:replace into table (id,name) values('1','aa'),('二','bb'))语句,DELETE包括DELETE和REPLACE语句

 案例:

update型
after update 和 before update 两种

更换某一行时激活触发器,恐怕由此 update 语句触发

删去触发器:

 

  • 运用drop trigger 触发器名;来删除触发器

 

 


     2)对于某一表,不可能有三个BEFORE UPDATE触发程序。但能够有二个BEFORE UPDATE触发程序和3个BEFORE INSERT触发程序,或贰个BEFORE UPDATE触发程序和一个AFTE福睿斯 UPDATE触发程序

       下面的多寡是死多少,但在支付进度中对某件商品购进几件是动态的 (表关系同上)

delete型
after delete 和 before delete 两种

剔除某1行时激活触发器,只怕因而 delete 语句触发

触发器的新旧记录引用:

 

对于一些情状不常候或者必要引用一下事先的数码,例如扩大学生数必要精通前边的学生数

new是新插入的数据,old是原先的数量【插入的时候从不旧数据,删除没有新数据,更新既有旧又有新。(这里指的是事件类型)】

使用odlnew.字段名来引用数据。(注意引用的是接触触发器(事件)的言辞的数码)

下边是二个例子:(当插入学生记录时,通过new.name获取新插入的学员的名字,然后将new.name插入到另1个表中)

 


     3)tbl_name必须引用永远性表。不可能将触及程序与TEMPORAOdysseyY表(有时表)或视图关联起来

图片 6图片 7

new 与 old

在 insert 型触发器中,new用来表示将在(before)或早已(after)插入的新数据;
在 update 型触发器中,old 用来表示将要或曾经被更改的原数据,new 用来代表就要或早已修改为的新数据;
在 delete 型触发器中,old 用来代表就要或已经被删除的原数据;
利用格局: new.columnName (columnName 为对应数据表某一列名)
其它,old 是只读的,而 new 则足以在触发器中选取 set 赋值,这样不会重新接触触发器,产生循环调用。

     四)触发程序(trigger_stmt中)无法调用将数据重返客户端的蕴藏程序(如SELECT查询),也无法使用应用CALL语句的动态SQL(允许存款和储蓄程序通过参数将数据再次来到触发程序)。触发程序也不能够利用以显式或隐式格局起初或收尾工作的讲话,如START TRANSACTION、COMMIT或ROLLBACK。

//触发器  当用户购买商品时更新商品数量
create trigger tg2
after insert on o
for each row 
begin
update g set num=num-new.much where gId=new.gId;
end $
//用户下单 (购买商品)
insert into o(gId,much) values(2,5)$
//触发器 当用户撤销订单时更新数量
create trigger tg3
after delete on o
for each row
begin
update g set num = num   old.much where gId = old.gId;
end $
//用户撤销订单
delete from o where oId = 1 $
//触发器 用户修改订单内商品的数量
create trigger tg4
after update on o
for each row
begin
    update g set num = num old.much-new.much where gId =old.gId/new.gId;
end $
//用户修改订单数量
update o set much =3 where oId = 2 $

除去触发器

drop trigger triggerName

本文由bwin必赢发布,转载请注明来源

关键词: 必赢 数据库技术 MySQL sql 数据库