50.9. 触发器(Trigger)
50.9.1. create trigger
50.9.1.1. Update 更新出发
实现 history 历史表功能,BEFORE update 做到数据库更新自动备份
CREATE TABLE user_history SELECT * FROM user WHERE 1 <> 1DELIMITER // CREATE TRIGGER user_history BEFORE update ON user FOR EACH ROW BEGIN insert into user_history SELECT * FROM user WHERE id = OLD.id; END; // DELIMITER ;
判断某字段数据修改满足条件后出发。
CREATE DEFINER=`dba`@`%` TRIGGER `cms`.`jc_content_BEFORE_UPDATE` BEFORE UPDATE ON `jc_content` FOR EACH ROW BEGINIF NEW.status = '1' THENinsert into `neo`.elasticsearch_trash(id) values(OLD.content_id);END IF;IF NEW.status = '2' THENdelete from `neo`.elasticsearch_trash where id = OLD.content_id;END IF; END
50.9.1.2. Delete 删除出发
CREATE DEFINER=`dba`@`%` TRIGGER `cms`.`jc_content_BEFORE_DELETE` BEFORE DELETE ON `jc_content` FOR EACH ROW BEGINinsert into `neo`.elasticsearch_trash(id) values(OLD.content_id); END
50.9.1.3. Insert 插入出发
50.9.2. drop trigger
DROP TRIGGER admin_user_history;DELIMITER // CREATE TRIGGER admin_user_history BEFORE update ON admin_user FOR EACH ROW BEGIN insert into admin_user_history SELECT * FROM admin_user WHERE user_id = OLD.user_id; END; // DELIMITER;
50.9.3. show triggers
show triggers;
50.9.3.1. SHOW CREATE TRIGGER
mysql> SHOW CREATE TRIGGER ins_sum\G *************************** 1. row ***************************Trigger: ins_sumsql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION SQL Original Statement: CREATE DEFINER=`me`@`localhost` TRIGGER ins_sumBEFORE INSERT ON accountFOR EACH ROW SET @sum = @sum + NEW.amountcharacter_set_client: utf8collation_connection: utf8_general_ciDatabase Collation: latin1_swedish_ciCreated: 2013-07-09 10:39:34.96
50.9.4. EXAMPLE
50.9.4.1. BEFORE/AFTER
例 50.1. BEFORE/AFTER
DROP TRIGGER MY_TEST_MONITOR; DELIMITER // CREATE TRIGGER MY_TEST_MONITOR BEFORE insert ON MY_TEST FOR EACH ROW BEGININSERT INTO MY_TEST_MONITOR SELECT * FROM MY_TEST WHERE TICKET = NEW.TICKET; END; // DELIMITER;
DROP TRIGGER MY_TEST_MONITOR; DELIMITER // CREATE TRIGGER MY_TEST_MONITOR AFTER insert ON MY_TEST FOR EACH ROW BEGININSERT INTO MY_TEST_MONITOR SELECT * FROM MY_TEST WHERE TICKET = NEW.TICKET; END; // DELIMITER;
通过触发器保护数据,防止重复插入数据
CREATE DEFINER=`neo`@`%` TRIGGER `members_before_insert` BEFORE INSERT ON `members` FOR EACH ROW BEGINIF new.username IS NOT NULL THENIF exists(select m.username from members m where m.username = new.username) THENset new.username = '';END IF;END IF; END
50.9.4.2. UUID
例 50.2. uuid()
delimiter $$CREATE TABLE `member` (`uuid` char(36) NOT NULL,`username` varchar(20) DEFAULT NULL,`password` varchar(32) DEFAULT NULL,PRIMARY KEY (`uuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$CREATE DEFINER=`root`@`%` TRIGGER `test`.`member_before_insert` BEFORE INSERT ON `test`.`member` FOR EACH ROW SET new.uuid = uuid() $$
50.9.4.3. CALL PROCEDURE
CREATE DEFINER=`neo`@`%` TRIGGER `accounts_angelfund` AFTER INSERT ON `accounts` FOR EACH ROW BEGINIF new.paymode = 'angelfund' THENcall angelfund(new.name,new.ctime); END IF;ENDCREATE DEFINER=`neo`@`%` PROCEDURE `angelfund`(IN `puid` VARCHAR(50), IN `ptime` DATETIME)LANGUAGE SQLNOT DETERMINISTICCONTAINS SQLSQL SECURITY DEFINERCOMMENT '' BEGINDECLARE fusername VARCHAR(16) DEFAULT NULL;DECLARE fchinese_name VARCHAR(16) DEFAULT NULL;DECLARE fmembers_date VARCHAR(20) DEFAULT NULL;SELECT username,chinese_name,FROM_UNIXTIME(createtime) INTO fusername,fchinese_name,fmembers_date FROM members WHERE username = puid;IF fusername IS NOT NULL THENINSERT IGNORE INTO angelfund(username,chinese_name,members_date,accounts_date,endtime,`status`,op,operator,`description`) value(fusername,fchinese_name,fmembers_date,ptime,DATE_ADD(ptime, INTERVAL +1 MONTH),'N','N','computer','');END IF;END
原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。
50.9. 触发器(Trigger)相关推荐
- MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 举个例子: 现有2个实体- 麻将机 学生.课程,1种联系- 成绩 分别创建 学生表 studen ...
- android sqlite触发器,SQLite---使用触发器(Trigger)
背景 当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理.于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理. Trigger ...
- MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )
--视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...
- mysql之触发器trigger
mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) ...
- oracle 数据库 触发器 trigger 语法
http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...
- SQL入门(3):定义约束/断言assertion/触发器trigger
本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...
- MySQL触发器 trigger学习
触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...
- WPF中的触发器(Trigger)
这节来讲一下WPF中的触发器--Trigger.触发器,是指在既定条件或者特殊场景下被触发,从而去执行一个操作.在WPF中,触发器可以分为以下几类:基本触发器(Trigger):事件触发器(Event ...
- WPF触发器(Trigger)
WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...
最新文章
- 学习java的一些笔记(6)
- 用go语言制作读取excel模板批量生成word工具
- 2020年1月份学习总结,死线(Deadline)杀死团队拖延症
- 程序员应该了解的几个接单平台,私活,码农!
- css 旋转 animation动画
- 详解Paint的setColorFilter(ColorFilter filter)
- SQL Server 查询性能优化——覆盖索引(一)
- bit.ly 短地址转换_使用PHP创建Bit.ly短URL:API版本3
- Unity—火焰特效制作
- 更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手
- codeforces 1153D Serval and Rooted Tree
- Java系统架构设计
- 鸿蒙系统 google应用
- 6.2 阈值处理-- 自适应阈值处理和 阈值Otsu处理
- Maven配置阿里云中央仓库
- linux安装tomcat
- 【企业】见相非相,即见如来
- 西安~培养我的文艺范儿
- allegro生成不规则钻孔
- 毕业设计源码之WMS--开源仓库管理系统