MySQL Crash Course #17# Chapter 25. 触发器(Trigger)
推荐看这篇mysql 利用触发器(Trigger)让代码更简单
以及 23.3.1 Trigger Syntax and Examples
感觉有点像 Spring 里的 AOP
我们为什么需要触发器? -- 因为我们希望当某件事情发生的时候另外一些事情自动发生。。
例如 在向某张表插入数据的时候,同时向另外一张表插入数据。
“向某张表插入数据” 就是事件(导火线),而“向另外一张表插入数据” 就是我们希望自动发生的事情(被触发的事情)。
可是为什么不自己手动“ 先向某表插入数据,再向另外一张表插入数据”呢?
个人觉得,有两个理由促使我们这么做:
- 实现某种业务逻辑,就像下了订单一定要减库存对吧? 但是这个活是上层应用程序做还是数据库做是个问题。
- 关注点分离。触发事件可以是一些琐碎、业务无关的安全性检查之类的,这个概念可以参考 Spring AOP
下面 COPY 几个 demo 备用。
首先是查看已存在的触发器:
SELECT * FROM information_schema.`TRIGGERS`;
删除已经存在的触发器:
DROP TRIGGER newproduct;
创建一个简单的触发器:
CREATE TRIGGER newproduct AFTER INSERT ON products
FOR EACH ROW SELECT 'Product added';
-- - 每当向 products 插入数据的时候都执行 SELECT 'Product added' ,// 原话打印
- - -- FOR EACH ROW 对于插入的每一条记录都这么做
--- -- PS. 触发器只能创建在实表上,不能创建在虚表上(视图)
-- - - - 每张表至多支持 6 个触发器 AFTER BEFORE 2 * 3 UPDATE DELETE INSERT = 6 PS. 这个有错。
- ---我尝试了一下居然运行不出来 。。 。 所以,以上规则可能在新版本有变化。。
mysql> CREATE TRIGGER newproduct AFTER INSERT ON products
-> FOR EACH ROW SELECT 'Product added';
ERROR 1415 (0A000): Not allowed to return a result set from a trigger
关于触发器的几个注意点:
- 触发器不能被覆盖 override ,要修改的话,只能先删除旧的、再创建一个新的。
- 在 BEFORE触发器 → SQL语句 → AFTER 触发器这个执行流程中,任何一步出现错误都将不再往下执行。
关于 OLD 和 NEW 关键词
Within the trigger body, the OLD
and NEW
keywords enable you to access columns in the rows affected by a trigger. OLD
and NEW
are MySQL extensions to triggers; they are not case-sensitive.
In an INSERT
trigger, only NEW.
can be used; there is no old row. In a col_name
DELETE
trigger, only OLD.
can be used; there is no new row. In an col_name
UPDATE
trigger, you can use OLD.
to refer to the columns of a row before it is updated and col_name
NEW.
to refer to the columns of the row after it is updated.col_name
A column named with OLD
is read only. You can refer to it (if you have the SELECT
privilege), but not modify it. You can refer to a column named with NEW
if you have the SELECT
privilege for it. In a BEFORE
trigger, you can also change its value with SET NEW.
if you have the col_name
= value
UPDATE
privilege for it. This means you can use a trigger to modify the values to be inserted into a new row or used to update a row. (Such a SET
statement has no effect in an AFTER
trigger because the row change will have already occurred.)
In a BEFORE
trigger, the NEW
value for an AUTO_INCREMENT
column is 0, not the sequence number that is generated automatically when the new row actually is inserted.
触发更多语句
By using the BEGIN ... END
construct, you can define a trigger that executes multiple statements.
mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGIN
IF NEW.amount < 0 THEN
SET NEW.amount = 0;
ELSEIF NEW.amount > 100 THEN
SET NEW.amount = 100;
END IF;
END;//
mysql> delimiter ;
demo
DROP TRIGGER IF EXISTS afterDeleteStudent;
DELIMITER //
CREATE TRIGGER afterDeleteStudent
AFTER DELETE ON stu
FOR EACH ROW
BEGIN
DELETE FROM SC WHERE SC.stu_id = OLD.id;
END //
DELIMITER ;
MySQL Crash Course #17# Chapter 25. 触发器(Trigger)的更多相关文章
- MySQL Crash Course #09# Chapter 17. Combining Queries: UNION
INDEX UNION Rules WHERE VS. UNION UNION VS. UNION ALL Sorting Combined Query Results UNION Rules As ...
- MySQL Crash Course #13# Chapter 21. Creating and Manipulating Tables
之前 manipulate 表里的数据,现在则是 manipulate 表本身. INDEX 创建多列构成的主键 自动增长的规定 查看上一次插入的自增 id 尽量用默认值替代 NULL 外键不可以跨引 ...
- MySQL Crash Course #11# Chapter 20. Updating and Deleting Data
INDEX Updating Data The IGNORE Keyword Deleting Data Faster Deletes Guidelines for Updating and Dele ...
- MySQL Crash Course #10# Chapter 19. Inserting Data
INDEX BAD EXAMPLE Improving Overall Performance Inserting Multiple Rows INSTEAD OF Inserting a Singl ...
- MySQL Crash Course #06# Chapter 13. 14 GROUP BY. 子查询
索引 理解 GROUP BY 过滤数据 vs. 过滤分组 GROUP BY 与 ORDER BY 之不成文的规定 子查询 vs. 联表查询 相关子查询和不相关子查询. 增量构造复杂查询 Always ...
- MySQL Crash Course #05# Chapter 9. 10. 11. 12 正则.函数. API
索引 正则表达式:MySQL only supports a small subset of what is supported in most regular expression implemen ...
- MySQL Crash Course #04# Chapter 7. 8 AND. OR. IN. NOT. LIKE
索引 AND. OR 运算顺序 IN Operator VS. OR NOT 在 MySQL 中的表现 LIKE 之注意事项 运用通配符的技巧 Understanding Order of Evalu ...
- MySQL Crash Course #21# Chapter 29.30. Database Maintenance & Improving Performance
终于结束这本书了,最后两章的内容在官方文档中都有详细介绍,简单过一遍.. 首先是数据备份,最简单直接的就是用 mysql 的内置工具 mysqldump MySQL 8.0 Reference Man ...
- MySQL Crash Course #20# Chapter 28. Managing Security
限制用户的操作权限并不是怕有人恶意搞破坏,而是为了减少失误操作的可能性. 详细文档:https://dev.mysql.com/doc/refman/8.0/en/user-account-manag ...
随机推荐
- tomcat启动报错“Error: Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: iZ25fsk1ifk: iZ25fsk1ifk”
在启动了Tomcat的时候出现下面的错误,导致启动不了,卡在读日志的状态 Error: Exception thrown by the agent : java.net.MalformedURLExc ...
- 猿团专访 |以技术推动发展 msup 成为企业经验智库
随着企业的发展,几乎所有的管理者都有同样一个痛点:如何才能让自己的团队变得更强,技术能力更能匹配企业发展需求?msup的创立毫无疑问解决了这个难点. 麦思博(msup)有限公司发源于美国西雅图,是一家 ...
- Python模块NumPy中的tile(A,rep) 函数
from NumPy import * 函数形式: tile(A,rep) 功能:重复A的各个维度 参数类型: - A: Array类的都可以 - rep:A沿着各个维度重复的次数 这个英文单词的本意 ...
- hihocoder 1322 - 树结构判定 - [hiho一下161周][模板题/水题]
题目链接:http://hihocoder.com/problemset/problem/1322 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶 ...
- 大数据竞赛平台Kaggle案例实战
Kaggle是由联合创始人.首席执行官安东尼·高德布卢姆(Anthony Goldbloom)2010年在墨尔本创立的,主要为开发商和数据科学家提供举办机器学习竞赛.托管数据库.编写和分享代码的平台. ...
- Oracle备份恢复之热备份恢复及异机恢复
原理: 数据库必须运行在归档模式下,否则备份没有意义.备份前冻结块头,使scn号不变化,然后cp物理文件,最后解冻块头.此过程dml语句可以正常执行,动作被写在日志文件里面,当解冻scn号后,日志文件 ...
- MongoDB3.x中添加用户和权限控制
现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限.注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth) ? 1 2 3 4 5 6 7 8 9 10 ...
- Ubuntu单用户模式(安全模式)
说下我遇到的情况,ubuntu服务器,防火墙关闭,连的外网.服务器中毒,病毒自动生成用户,然后病毒进程开启启动,进程启动后,cpu立马占满,服务器立马卡死,本想着服务器启动后通过top命 ...
- (转)Elasticsearch聚合初探——metric篇
前言 ES中的聚合被分为两大类:Metric度量和bucket桶(原谅我英语差,找不到合适的词语.....就用单词来说吧!).说的通俗点,metric很像SQL中的avg.max.min等方法,而bu ...
- Andrew Ng-ML-第十章-应用机器学习的建议
1.如何改进性能不好的学习算法 图1.运用到测试集上效果不佳 当进行一个正则化线性回归时,最小化了代价函数得到参数,但是运用到新的测试集上,发现效果不好,那么如何改进? 1).增加训练集.但是实际上花 ...