MySQL中的触发器,利用触发器

转载自:

风度翩翩,什么触发器

怎么着是触发器

差十分少的说,正是一张表产生了有些事(插入、删除、更新操作),然后自行触发了先行编写好的多少条SQL语句的实施;

1,个人领会

个性及意义

特点:触发事件的操作和触发器里的SQL语句是二个事务操作,具有原子性,要么全部执行,要么都不实行;

成效:保障数据的完整性,起到约束的功效;

触发器,从字面来领悟,一触即发的多个器,简单称谓触发器(哈哈,个人精通),举个例子吗,好比天黑了,你开灯了,你看看东西了。你放炮仗,激起了,一会就炸了。

事例:成立触发器,记录表的增、删、改操作记录

接下去将创制user和user_history表,以至四个触发器tri_insert_user、tri_update_user、tri_delete_user,分别对应user表的增、删、改三件事;

  • 创建user表;

    1 DROP TABLE IF EXISTS user; 2 CREATE TABLE user ( 3 id bigint(20) NOT NULL AUTO_INCREMENT, 4 account varchar(255) DEFAULT NULL, 5 name varchar(255) DEFAULT NULL, 6 address varchar(255) DEFAULT NULL, 7 PRIMARY KEY (id) 8 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 始建对user表操作历史表;

    DROP TABLE IF EXISTS user_history; CREATE TABLE user_history ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, operatetype varchar(200) NOT NULL, operatetime datetime NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 创制user表插入事件对应的触发器tri_insert_user;

几点表明:

DELIMITEPAJERO:修改输入的结束符,私下认可景况下输入完成符是分号;,这里把它改成了多少个支行;;,那样做的指标是把多条含分号的话语做个包装,全体输入完事后一起实行,并非黄金时代碰到暗中认可的分局甘休符就机关实施;

new:当触发插入和翻新事件时可用,指向的是被操作的记录

old: 当触发删除和翻新事件时可用,指向的是被操作的记录

图片 1

DROP TRIGGER IF EXISTS `tri_insert_user`;
DELIMITER ;;
CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
end
;;
DELIMITER ;

图片 2

  • 创制user表更新事件对应的触发器tri_update_user;

图片 3

DROP TRIGGER IF EXISTS `tri_update_user`;
DELIMITER ;;
CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
end
;;
DELIMITER ;

图片 4

  • 成立user表删除事件对应的触发器tri_delete_user;

图片 5

DROP TRIGGER IF EXISTS `tri_delete_user`;
DELIMITER ;;
CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now());
end
;;
DELIMITER ;

图片 6

  • 由来,全部表及触发器创立完结,开端验证结果,分别做插入、纠正、删除事件,试行以下语句,观望user_history是或不是自动发出操作记录;

图片 7

INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1');
INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2');

UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1';

DELETE FROM `user` where name = 'user2';

图片 8

  • 观测结果user表和user_history表的结果,操作记录已发出,表明触发器专门的学问健康;

图片 9

2,官方概念

弊端

追加程序的复杂度,某一件事情逻辑在代码中管理,有些专门的学问逻辑用触发器管理,会使前期维护变得紧Baba;

 

 

 

触发器(trigger)是个卓绝的积累进度,它的实践不是由程序调用,亦非手工业运营,而是由事件来触发,譬喻当对四个表实行操作( insert,delete, update)时就能够激活它施行。触发器经常用来抓好数据的完整性限制和专门的工作法规等。 触发器能够从 DBA_TRIGGERS ,USER_T宝马X5IGGEGL450S 数据字典中查到。

触发器有二个丰盛好的特征就是:触发器能够禁绝或回滚违反援用完整性的更改,进而撤除所尝试的数码改良。

什么样看头,举例解释一下,街机游戏大家都玩过呢,闯过生龙活虎关,闯下一关,有后生可畏关没闯过将在从第意气风发关起来。触发器根这几个看似。

法定解释如下
接触程序视为单后生可畏交易中的风流倜傥部份,因而得以由原触发程序还原交易,若是在交易进度中侦测到严重的荒唐(如使用者中断连线),则会自行回复整个交易。

她的功能很明白了,能够保重数据的完整性,下边有一个实例来注解他的功利,以至生龙活虎旦使编写代码不那么复杂

二,触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_event

    ON tbl_name FOR EACH ROW trigger_stmt

接触程序是与表有关的命名数据库对象,当表上冒出一定事件时,将激活该对象。

接触程序与命名叫tbl_name的表相关。tbl_name必须援引恒久性表。无法将触发程序与TEMPORA君越Y表或视图关联起来。

trigger_time是接触程序的动作时间。它能够是BEFORE或AFTE福睿斯,以指明触发程序是在激活它的语句在此以前或之后触发。

trigger_event指明了激活触发程序的说话的品种。trigger_event能够是下述值之生机勃勃:

·         INSERT:将新行插入表时激活触发程序,举例,通过INSERT、LOAD DATA和REPLACE语句。

·         UPDATE:改革某风姿洒脱行时激活触发程序,比如,通过UPDATE语句。

·         DELETE:从表中删除某黄金时代行时激活触发程序,比如,通过DELETE和REPLACE语句。

请注意,trigger_event与以表操作形式激活触发程序的SQL语句并不很左近,这一点很要紧。比如,关于INSERT的BEFORE触发程序不仅可以被INSERT语句激活,也能被LOAD DATA语句激活。

莫不会导致混淆的例证之一是INSERT INTO .. ON DUPLICATE UPDATE …语法:BEFORE INSERT触发程序对于每生机勃勃行将激活,后跟AFTELANDINSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情形决意于行上是或不是有重复键。

对于具有相像触发程序动作时间和事件的给定表,不能够有三个触发程序。举个例子,对于某一表,不能够有四个BEFORE UPDATE触发程序。但能够有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTE福睿斯 UPDATE触发程序。

trigger_stmt是当接触程序激活时实践的说话。假若您打算实践八个语句,可使用BEGIN … END复合语句结构。那样,就会运用存款和储蓄子程序中允许的生龙活虎律语句

三,创造解发器

1,用户表user

查看复制打印?

  1. CREATE TABLE `user` (   
  2. `id` int(11) NOT NULL auto_increment COMMENT '用户ID',   
  3. `name` varchar(50) NOT NULL default '' COMMENT '名称',   
  4. `sex` int(1) NOT NULL default '0' COMMENT '0为男,1为女',   
  5. PRIMARY KEY  (`id`)   
  6. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;   
  7.   
  8. INSERT INTO `user` (`id`, `name`, `sex`) VALUES   
  9. (1, '张映', 0),   
  10. (2, 'tank', 0);  

    CREATE TABLE user ( id int(11) NOT NULL auto_increment COMMENT '用户ID', name varchar(50) NOT NULL default '' COMMENT '名称', sex int(1) NOT NULL default '0' COMMENT '0为男,1为女', PRIMARY KEY  (id) ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

    INSERT INTO user (id, name, sex) VALUES (1, '张映', 0), (2, 'tank', 0);

id name sex
1 张映 0
2 tank 0

2,评论表comment

查看复制打印?

  1. CREATE TABLE `comment` (   
  2. `c_id` int(11) NOT NULL auto_increment COMMENT '评论ID',   
  3. `u_id` int(11) NOT NULL COMMENT '用户ID',   
  4. `name` varchar(50) NOT NULL default '' COMMENT '顾客名称',   
  5. `content` varchar(1000) NOT NULL default '' COMMENT '研商内容',   
  6. PRIMARY KEY  (`c_id`)   
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;   
  8.   
  9. INSERT INTO `comment` (`c_id`, `u_id`, `name`, `content`) VALUES   
  10. (1, 1, '张映', '触发器测量检验'),   
  11. (2, 1, '张映', '化解字段冗余'),   
  12. (3, 2, 'tank', '使代码更简短');  

    CREATE TABLE comment ( c_id int(11) NOT NULL auto_increment COMMENT '评论ID', u_id int(11) NOT NULL COMMENT '用户ID', name varchar(50) NOT NULL default '' COMMENT '客商名称', content varchar(1000) NOT NULL default '' COMMENT '争辩内容', P凯雷德IMA途睿欧Y KEY  (c_id) ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

    INSERT INTO comment (c_id, u_id, name, content) VALUES (1, 1, '张映', '触发器测验'), (2, 1, '张映', '消弭字段冗余'), (3, 2, 'tank', '使代码更简约');

c_id u_id name content
1 1 张映 触发器测试
2 1 张映 解决字段冗余
3 2 tank 使代码更简单

在这里处有三个冗余字段name,大家在读取批评进能够用生龙活虎道查寻来找到user表中的名字,为何要有冗余字段呢,因轻便的sql语句试行功能更加高,但不是冗余字段更加的多越好,冗余字段多了,同样会增大多据库肩负.

自己要做的事体是,当本人更新user表的name时,触发器相同的时间立异comment表,就不用写php代码去校勘了,当客商被删除时,comment表中,有关该客户的数量将被剔除

3,更新name触发器

查看复制打印?

  1. delimiter ||      //mysql 暗中同意甘休符号是分号,当你在写触发器恐怕存款和储蓄进度时有分号出现,会半途而废转而试行  
  2. drop trigger if exists updatename||    //删除同名的触发器,   
  3. create trigger updatename after update on user for each row   //建设构造触发器,   
  4. begin   
  5. //old,new都以象征当前操作的记录行,你把它当成表名,也行;   
  6. if new.name!=old.name then   //当表中顾客名称发生变化时,实施   
  7. update comment set comment.name=new.name where comment.u_id=old.id;   
  8. end if;   
  9. end||  

    delimiter ||      //mysql 暗中认可甘休符号是分号,当您在写触发器恐怕存款和储蓄进程时有分号现身,会搁浅转而履行drop trigger if exists updatename||    //删除同名的触发器, create trigger updatename after update on user for each row   //建构触发器, begin //old,new都以意味着当前操作的记录行,你把它正是表名,也行; if new.name!=old.name then   //当表中客商名称爆发变化时,实行update comment set comment.name=new.name where comment.u_id=old.id; end if; end||

delimiter ;

3,触发器删除comment数据

查看复制打印?

  1. delimiter ||   
  2. drop trigger if exists deletecomment||   
  3. create trigger deletecomment before delete on user for each row   
  4. begin   
  5. delete from comment where comment.u_id=old.id;   
  6. end||   
  7. delimiter ;  

    delimiter || drop trigger if exists deletecomment|| create trigger deletecomment before delete on user for each row begin delete from comment where comment.u_id=old.id; end|| delimiter ;

有一点点很令人失魂落魄,正是写好的触发器代码,不可能改正,你要去除掉重建,烦扰中,对了还应该有点正是phpmyadmin,有的能制造触发器,有的不能够,有的能成立,但创立了看不到。在研商一下。

4,测验触发器是还是不是可用

a,测试updata触发器

update user set name=’苍鹰’  where id = 1;

更新后去comment表里面看看,里面name字段里面包车型客车段有未有转移

b,测试delete触发器

delete from user  where id = 1;

更新后去comment表里面看看,里面name字段里面包车型大巴段有未有变动

四,触发器的帮助和益处

1,触发器的”自动性”

对技术员来讲,触发器是看不到的,不过她的确做业务了,借使不用触发器的话,你更新了user表的name字段时,你还要写代码去改良任何表里面包车型地铁冗余字段,笔者比如子,只是一张表,要是是几张表都有冗余字段呢,你的代码是或不是要写过多啊,看上去是或不是非常不爽呢。

2,触发器的数据完整性

触发器有回滚性,举个例证,小编意识作者很喜欢举子,正是您要更新五张表的多寡,不相会世更新了三个张表,而其余三张表没有修改。

而是倘倘若用php代码去写的话,就有异常的大可能率现身这种景观的,举例你更新了二张表的数目,此时,数据库挂掉了。你就苦恼了,有的更新了,有的没更新。那样页面彰显不风度翩翩致了,变有bug了。

 

转发请表明
小编:海底苍鹰
地址:[

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:MySQL中的触发器,利用触发器

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。