触发器(Trigger)

触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。触发器可以查询其他表,而且可以包含复杂的 SQL 语句。 它们主要用于强制服从复杂的业务规则或要求。 例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系

优点

  1. 触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改;
  2. 触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息;
  3. 触发器还可以强制执行业务规则;
  4. 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策;

缺点

  1. 过多的触发器使得数据逻辑变得复杂;
  2. 数据操作比较隐含,不易进行调整修改;
  3. 触发器的功能逐渐在代码逻辑或事务中替代实现,更符合面向对象的思想。

基本操作

注意:本文的SQL 在 MySQL 8.0版本中测试通过

创建触发器

CREATE[DEFINER = {user | CURRENT_USER}]TRIGGER trigger_nametrigger_time trigger_eventON Table_name FOR EACH ROWtrigger_body

DEFINER:定义可以激活触发器的用户

trigger_time:值只有两个,即before和after,表示触发器执行的时间在事件发生前或发生后

trigger_event:值只有三个,即insert,update和delete,表示触发触发器的事件

ON Table_name:触发器是关联在那个表上的

FOR EACH ROW:表示触发器执行的间隔,这里表示每个修改的记录都会触发触发器

trigger_body:代表触发器所要触发的动作

查看触发器

show triggers;

删除触发器

drop trigger [if exists] trigger_name;

应用实例

创建如下商品表和订单表,并插入初始商品信息,其中订单的初始编号从1000开始。

create table orders(order_id INT AUTO_INCREMENT PRIMARY KEY,good_id INT,order_number INT
);
alter table orders AUTO_INCREMENT = 1000;
create table goods(id INT,name varchar(255),price FlOAT,number INT
);
insert into goods values(10001, "cream", 80, 1000);
insert into goods values(10002, "cleanser", 40, 5000);
insert into goods values(10003, "sweater", 99, 13000);
insert into goods values(10004, "honey", 88, 14000);
insert into goods values(10005, "keyboard", 66, 12000);

新增订单时,对订单进行限购处理,每次订单数量小于100,不符合要求时给出相应提示,此时可以创建插入触发器如下:

DELIMITER $;
create trigger order_insert before insert on orders for each row beginif new.order_number <= 0 thensignal sqlstate '40001' set message_text = 'the order number should more than 0';set new.order_number = 1;elseif new.order_number >= 100 thensignal sqlstate '40002' set message_text = 'the order number should less than 100';set new.order_number = 99;elseupdate goods set number = number - new.order_number where id = new.good_id;end if;end;

插入数据验证如下:

mysql> insert into orders(good_id, order_number) values(10001, 99);
Query OK, 1 row affected (0.01 sec)mysql> select * from goods;
+-------+----------+-------+--------+
| id    | name     | price | number |
+-------+----------+-------+--------+
| 10001 | cream    |    80 |    901 |
| 10002 | cleanser |    40 |   5000 |
| 10003 | sweater  |    99 |  13000 |
| 10004 | honey    |    88 |  14000 |
| 10005 | keyboard |    66 |  12000 |
+-------+----------+-------+--------+
5 rows in set (0.00 sec)mysql> select * from orders;
+----------+---------+--------------+
| order_id | good_id | order_number |
+----------+---------+--------------+
|     1000 |   10001 |           99 |
+----------+---------+--------------+
1 row in set (0.00 sec)mysql> insert into orders(good_id, order_number) values(10001, -3);
ERROR 1644 (40001): the order number should more than 0
mysql> insert into orders(good_id, order_number) values(10001, 100);
ERROR 1644 (40002): the order number should less than 100

修改订单信息时,需要对商品信息进行同步处理,此时创建更新触发器如下:

DELIMITER $;
create trigger order_update before update on orders for each row beginif new.order_number <= 0 thensignal sqlstate '40003' set message_text = 'the order number should more than 0';set new.order_number = 1;elseif new.order_number >= 100 thensignal sqlstate '40004' set message_text = 'the order number should less than 100';set new.order_number = 99;elseupdate goods set number = number + old.order_number - new.order_number where id = new.good_id;end if;end;

更新数据验证如下:

mysql> update orders set order_number = 199 where order_id = 1000;
ERROR 1644 (40004): the order number should less than 100
mysql> update orders set order_number = -6 where order_id = 1000;
ERROR 1644 (40003): the order number should more than 0
mysql> update orders set order_number = 88 where order_id = 1000;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from goods;
+-------+----------+-------+--------+
| id    | name     | price | number |
+-------+----------+-------+--------+
| 10001 | cream    |    80 |    912 |
| 10002 | cleanser |    40 |   5000 |
| 10003 | sweater  |    99 |  13000 |
| 10004 | honey    |    88 |  14000 |
| 10005 | keyboard |    66 |  12000 |
+-------+----------+-------+--------+
5 rows in set (0.00 sec)mysql> select * from orders;
+----------+---------+--------------+
| order_id | good_id | order_number |
+----------+---------+--------------+
|     1000 |   10001 |           88 |
+----------+---------+--------------+
1 row in set (0.00 sec)

当取消订单时,也需要对商品信息进行同步处理,此时创建删除触发器如下:

DELIMITER $;
create trigger order_delete after delete on orders for each row beginupdate goods set number = number + old.order_number where id = old.good_id;end;

删除数据验证如下:

mysql> delete from  orders where order_id = 1000;
Query OK, 1 row affected (0.01 sec)mysql> select * from goods;
+-------+----------+-------+--------+
| id    | name     | price | number |
+-------+----------+-------+--------+
| 10001 | cream    |    80 |   1000 |
| 10002 | cleanser |    40 |   5000 |
| 10003 | sweater  |    99 |  13000 |
| 10004 | honey    |    88 |  14000 |
| 10005 | keyboard |    66 |  12000 |
+-------+----------+-------+--------+
5 rows in set (0.00 sec)
mysql> select * from orders;
Empty set (0.00 sec)

触发器(Trigger)相关推荐

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

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

  2. mysql之触发器trigger

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

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

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

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

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

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

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

  6. MySQL触发器 trigger学习

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

  7. WPF中的触发器(Trigger)

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

  8. WPF触发器(Trigger)

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

  9. mysql添加序列触发器_Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例...

    问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(tri ...

  10. mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目

    触发器(Trigger)的起源 MySQL是最受欢迎的开源RDBMS,被社区和企业广泛使用.触发器是MySQL在5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是视图(view)与存 ...

最新文章

  1. 生物信息通识技术研讨会
  2. Keepalived原理与实战精讲
  3. curl 与 httpie 命令
  4. 转:微软未公开的几个过程介绍及用法
  5. 二进制在计算机电路中得到广泛的应用,模拟电子和数字电子技术的区别及应用...
  6. 要选择做有价值的事情
  7. 7.1 pdo 宝塔面板php_CentOS 7.6下宝塔面板 PHP7.2安装sqlsrv扩展
  8. 【直播预告 | 今天10:30】多媒体技术 PI 第一期:OSS圆桌
  9. PHP+MySql+PDO实现简单增加、删除、修改、查询
  10. MySQL InnoDB 存储引擎文件
  11. 鸿蒙对比ios流畅对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
  12. mysql死锁抛出异常_如何排查和处理 MySQL 死锁异常?详细分析及解决方法步骤
  13. CmsEasy可视化编辑商城系统源码
  14. Linux的顶级十六进制编辑器
  15. 移植MotionDriver到RTT
  16. 一个公式竟然破解了年轻人的行为“密码”
  17. 计算机主机光盘故障,电脑开机之后提示插入安装光盘的解决方法
  18. go多版本管理之gvm
  19. FPGA2016~2018,FPL2017会议论文整理
  20. 如何创建批处理文件?

热门文章

  1. java BufferedImage 转base64
  2. windows批处理命令:创建文件并写入内容的bat脚本
  3. Python表白妙招,把情书写进她的照片里
  4. 王道操作系统网课笔记合集
  5. 求星期算法c语言程序,C语言根据指定日期计算是星期几
  6. 阅读笔记--现代操作系统
  7. 【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用
  8. MATLAB之易经卜卦程序+GUI
  9. 大学计算机基础方案一,《大学计算机基础》实验实施方案-学生用汇.docx
  10. access通过身份证号提取性别_Access计算根据身份证号码字段计算年龄和性别的表达式,最好是还能确定户籍地址,该在什么地方输入?...