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)相关推荐

  1. MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除

    我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 举个例子: 现有2个实体- 麻将机 学生.课程,1种联系- 成绩 分别创建 学生表 studen ...

  2. android sqlite触发器,SQLite---使用触发器(Trigger)

    背景 当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理.于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理. Trigger ...

  3. MSSQL 视图/事务(TRAN[SACTION])/存储过程(PROC[EDURE])/触发器(TRIGGER )

    --视图 视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数据,其结构和数据是建立在对表的查询基础上 视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同: 数据表是实际存储记录的地方, ...

  4. mysql之触发器trigger

    mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete)  ...

  5. oracle 数据库 触发器 trigger 语法

    http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...

  6. SQL入门(3):定义约束/断言assertion/触发器trigger

    本文介绍数据库的完整性 完整性控制程序: 指定规则,检查规则 (规则就是约束条件) 动态约束 intergrity constraint::=(O,P,A,R) O : 数据集合, 约束的对象 ?: ...

  7. MySQL触发器 trigger学习

    触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...

  8. WPF中的触发器(Trigger)

    这节来讲一下WPF中的触发器--Trigger.触发器,是指在既定条件或者特殊场景下被触发,从而去执行一个操作.在WPF中,触发器可以分为以下几类:基本触发器(Trigger):事件触发器(Event ...

  9. WPF触发器(Trigger)

    WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...

最新文章

  1. 学习java的一些笔记(6)
  2. 用go语言制作读取excel模板批量生成word工具
  3. 2020年1月份学习总结,死线(Deadline)杀死团队拖延症
  4. 程序员应该了解的几个接单平台,私活,码农!
  5. css 旋转 animation动画
  6. 详解Paint的setColorFilter(ColorFilter filter)
  7. SQL Server 查询性能优化——覆盖索引(一)
  8. bit.ly 短地址转换_使用PHP创建Bit.ly短URL:API版本3
  9. Unity—火焰特效制作
  10. 更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手
  11. codeforces 1153D Serval and Rooted Tree
  12. Java系统架构设计
  13. 鸿蒙系统 google应用
  14. 6.2 阈值处理-- 自适应阈值处理和 阈值Otsu处理
  15. Maven配置阿里云中央仓库
  16. linux安装tomcat
  17. 【企业】见相非相,即见如来
  18. 西安~培养我的文艺范儿
  19. allegro生成不规则钻孔
  20. 毕业设计源码之WMS--开源仓库管理系统

热门文章

  1. 纯Java代码 图片压缩
  2. Linux之父道歉后,Linux社区颁布开发人员行为准则
  3. 解读现代存储系统背后的经典算法
  4. 【Absible学习】Ansible普通用户sudo执行指令
  5. 你会想待下去吗?世界上25个最惊险的屋顶
  6. linux ssh密钥登录
  7. JS学习笔记(二)变量、作用域及内存问题
  8. 使用模板部署的Linux虚拟机网卡不可用的处理方法
  9. 基于LDAP的WebLogic虚拟化统一用户权限管理
  10. 我的IT之路2011(二)