🚀 Database
1、数据库基础
1.1 事务的概念和特性
1.2 锁
1.3 锁协议
1.4 事务日志
1.5 MVCC实现原理
1.6 基础知识
1.6.1 三范式
1.6.2 多表连接方式
1.6.3 存储过程
1.6.4 TRUNCATE和DROP的区别
1.6.5 触发器
1.6.6 视图
2、MySQL
2.1 索引
2.2 索引组织表
2.3 InnoDB和MyISAM的区别
2.4 Checkpoint技术
2.5 宕机恢复原理
2.6 数据库优化
2.7 分库分表
2.8 一致性哈希算法
2.9 主从复制
3、Redis
3.1 概述
3.1.1 为什么Redis单线程还这么快
3.1.2 Redis数据类型
3.1.3 持久化机制
3.1.4 过期机制和内存淘汰策略
3.2 线程模型
3.3 分布式问题
3.3.1 Redis实现分布式锁
3.4 缓存异常
3.4.1 缓存击穿、缓存雪崩
3.5 高可用
3.5.1 主从复制
3.5.2 哨兵模式
3.5.3 集群模式
-
+
游客
注册
登录
触发器
## 1 含义 1. 触发器是**与表有关的数据库对象**,在**满足定义条件时触发**,并**执行触发器中定义的语句集合**。 2. 触发器在数据库中**以独立的对象存储**,用于**保证数据完整性**(比如在**写入数据表前**,**强制检验或转换数据**)。 3. 触发器**只能创建在永久表上**,**不能对临时表创建触发器**。 4. **MySQL的触发器是针对每一行执行**,比如**向一张表中插入500条数据**,**就会触发500次触发器**。 5. MySQL中定义了`NEW`和`OLD`用来表示**触发器所在表中触发了触发器的那一行数据**: 1. `NEW`**表示新数据**,`OLD`**表示旧数据**。 2. `NEW`**可以在触发器中使用 `SET`赋值**,这样**不会再次触发触发器**,而`OLD`**是只读的**。 ## 2 四要素 1. **监视地点:**`TABLE`。 2. **监视事件:**`INSERT`、`UPDATE`、`DELETE`。 3. **触发时间:**`AFTER`、`BEFORE`。 4. **触发事件:**`INSERT`、`UPDATE`、`DELETE`。 ## 3 注意事项 1. 因为在MySQL中触发器是**针对行**的,因此**对于增、删、改非常频繁的表上切记不要使用触发器**,因为他会**非常消耗资源**。 ## 4 相关操作 ### 4.1 创建触发器 #### 4.1.1 基本语法 ```sql CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE } trigger_order: { FOLLOWS | PRECEDES } other_trigger_name ``` 1. `BEFORE`和`AFTER`参数指定了**触发执行的时间**,在事件之前还是事件之后。 2. `FOR EACH ROW`表示**任何一条记录上的操作满足触发事件都会触发该触发器**,也就是说**触发器的触发频率是针对每一行数据触发一次**。 3. `trigger_event`: 1. **`INSERT`型触发器:插入某一行时触发触发器**,可能通过`INSERT`、`LOAD DATA`、`REPLACE`语句触发(`LOAD DATA`语句用于将一个文件装入到一个数据表中,相当于一系列的`INSERT`操作)。 2. **`UPDATE`型触发器:更改某一行时触发触发器**,可能通过`UPDATE`语句触发。 3. **`DELETE`型触发器:删除某一行时触发触发器**,可能通过`DELETE`、`REPLACE`语句触发。 4. `trigger_order`:**MySQL 5.7之后的一个功能**,用于**定义多个触发器**,**使用 `FOLLOWS`**(尾随)**或 `PRECEDES`**(在...之前)**来选择触发器执行的先后顺序**。 #### 4.1.2 示例 ```shell mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); 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 ; mysql> update account set amount=-10 where acct_num=137; mysql> select * from account; +----------+---------+ | acct_num | amount | +----------+---------+ | 137 | 0.00 | | 141 | 1937.50 | | 97 | -100.00 | +----------+---------+ mysql> update account set amount=200 where acct_num=137; mysql> select * from account; +----------+---------+ | acct_num | amount | +----------+---------+ | 137 | 100.00 | | 141 | 1937.50 | | 97 | -100.00 | +----------+---------+ ``` ### 4.2 查看触发器 1. 使用 `show triggers`查看触发器信息: ```shell mysql> show triggers; ``` 2. 在 `information_schema.triggers`中查看触发器信息: ```shell mysql> SELECT * FROM information_schema.triggers where trigger_name='upd_check'; ``` ### 4.3 删除触发器 删除触发器的语法如下: ```sql drop trigger [if exists] [schema_name].trigger_name; ``` ## 参考文献 1. [Drop/Delete/Truncate的区别?](https://github.com/wolverinn/Waking-Up/blob/master/Database.md#DropDeleteTruncate%E7%9A%84%E5%8C%BA%E5%88%AB) 2. [MySQL - 触发器](https://lyonyang.github.io/blogs/03-MySQL/09-MySQL%20-%20%E8%A7%A6%E5%8F%91%E5%99%A8.html)。 3. [一篇很棒的 MySQL 触发器学习教程](https://blog.csdn.net/qq_36396104/article/details/80469997)。 4. [MySQL触发器trigger的使用](https://www.cnblogs.com/geaozhang/p/6819648.html)。
ricear
2021年7月4日 17:39
©
BY-NC-ND(4.0)
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码