触发器(Trigger)
触发器(Trigger)
触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。触发器可以查询其他表,而且可以包含复杂的 SQL 语句。 它们主要用于强制服从复杂的业务规则或要求。 例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系
优点
- 触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改;
- 触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息;
- 触发器还可以强制执行业务规则;
- 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策;
缺点
- 过多的触发器使得数据逻辑变得复杂;
- 数据操作比较隐含,不易进行调整修改;
- 触发器的功能逐渐在代码逻辑或事务中替代实现,更符合面向对象的思想。
基本操作
注意:本文的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)相关推荐
- MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1有关的若干记录. 举个例子: 现有2个实体- 麻将机 学生.课程,1种联系- 成绩 分别创建 学生表 studen ...
- 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 : 数据集合, 约束的对象 ?: ...
- android sqlite触发器,SQLite---使用触发器(Trigger)
背景 当数据库中的数据太多时,往往需要进行清理,将一些过时的数据删除,但是往往找不到合适的时机进行清理.于是SQLite提供了Trigger,当某些事件发生时,可以触发并且进行处理. Trigger ...
- MySQL触发器 trigger学习
触发器:一类特殊的事物.可监视某种数据操作,并触发相关操作(insert/update/delete).表中的某些数据改变,希望同一时候能够引起其他相关数据改变的需求. 作用:变化自己主动完毕某些语句 ...
- WPF中的触发器(Trigger)
这节来讲一下WPF中的触发器--Trigger.触发器,是指在既定条件或者特殊场景下被触发,从而去执行一个操作.在WPF中,触发器可以分为以下几类:基本触发器(Trigger):事件触发器(Event ...
- WPF触发器(Trigger)
WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...
- mysql添加序列触发器_Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例...
问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的.而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(tri ...
- mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目
触发器(Trigger)的起源 MySQL是最受欢迎的开源RDBMS,被社区和企业广泛使用.触发器是MySQL在5.0.1(开天辟地一版本)中增加的三大新功能之一,另外两个师兄弟是视图(view)与存 ...
最新文章
- 生物信息通识技术研讨会
- Keepalived原理与实战精讲
- curl 与 httpie 命令
- 转:微软未公开的几个过程介绍及用法
- 二进制在计算机电路中得到广泛的应用,模拟电子和数字电子技术的区别及应用...
- 要选择做有价值的事情
- 7.1 pdo 宝塔面板php_CentOS 7.6下宝塔面板 PHP7.2安装sqlsrv扩展
- 【直播预告 | 今天10:30】多媒体技术 PI 第一期:OSS圆桌
- PHP+MySql+PDO实现简单增加、删除、修改、查询
- MySQL InnoDB 存储引擎文件
- 鸿蒙对比ios流畅对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
- mysql死锁抛出异常_如何排查和处理 MySQL 死锁异常?详细分析及解决方法步骤
- CmsEasy可视化编辑商城系统源码
- Linux的顶级十六进制编辑器
- 移植MotionDriver到RTT
- 一个公式竟然破解了年轻人的行为“密码”
- 计算机主机光盘故障,电脑开机之后提示插入安装光盘的解决方法
- go多版本管理之gvm
- FPGA2016~2018,FPL2017会议论文整理
- 如何创建批处理文件?
热门文章
- java BufferedImage 转base64
- windows批处理命令:创建文件并写入内容的bat脚本
- Python表白妙招,把情书写进她的照片里
- 王道操作系统网课笔记合集
- 求星期算法c语言程序,C语言根据指定日期计算是星期几
- 阅读笔记--现代操作系统
- 【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用
- MATLAB之易经卜卦程序+GUI
- 大学计算机基础方案一,《大学计算机基础》实验实施方案-学生用汇.docx
- access通过身份证号提取性别_Access计算根据身份证号码字段计算年龄和性别的表达式,最好是还能确定户籍地址,该在什么地方输入?...