版本比较
比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
触发器
触发器也是存储例程中的一种,用于MySQL服务器在特定情况下自动调用,比如:
- 在向t1表插入或更新数据之前自动对数据进行校验,要求m1列的值在1~10之间,校验规则如下:
- 如果插入的记录的m1列值小于1,则按1插入;
- 如果m1列的值大于10,则按10插入;
- 在向t1表插入记录后自动把这条记录插入到t2表。
创建触发器
代码块 |
---|
CREATE TRIGGER 触发器名 {BEFORE | AFTER} {INSERT | DELETE | UPDATE} ON 表名 FOR EATCH ROW BEGIN 触发器内容 END |
{BEFORE | AFTER}
表示触发器执行的时机:BEFORE
: 在语句执行前执行触发器AFTER
: 在语句执行后执行触发器
{INSERT | DELETE | UPDATE}
表示对哪种语句设置触发器,只支持这三种语句。FOR EACH ROW BEGIN ... END
表示对影响到的每条记录执行相关的触发器内容:- 对于
INSERT
语句来说,影响的记录是那些准备插入的新记录; - 对于
DELETE
和UPDATE
语句来说,影响的记录是符合WHERE
条件的记录(如果没有WHERE
,则表示全部记录);
- 对于
MySQL提供了NEW
和OLD
两个单词来代表新记录和旧记录的值,它们的含义如下:
- 对于INSERT语句的触发器来说,NEW代表准备插入的记录,OLD无效。
- 对于DELETE语句的触发器来说,OLD代表删除前的记录,NEW无效。
- 对于UPDATE语句的触发器来说,NEW代表修改后的记录,OLD代表修改前的记录。
以下是一个触发器的示例:
代码块 |
---|
DELIMITER $ CREATE TRIGGER bi_t1 BEFORE INSERT ON t1 FOR EACH ROW BEGIN IF new.m1 < 1 THEN SET new.m1 = 1; ELSEIF new.m1 > 10 THEN SET new.m1 = 10; END IF; END $ DELIMITER ; |
查看和删除触发器
查看:
代码块 |
---|
SHOW TRIGGERS; |
查看定义:
代码块 |
---|
SHOW CREATE TRIGGER 触发器名 |
删除:
代码块 |
---|
DROP TRIGGER 触发器名 |
触发器使用注意事项
- 触发器内容中不能有输出结果集的语句,比如 SELECT。
- 触发器内容中NEW代表的值可以被更改,但OLD代表的值不能被更改。
- 在BEFORE触发器中,可以使用 "SET NEW.列名 = 值" 的形式来更改待插入的值,但是这种操作不能在AFTER触发器中使用。
事件
用于MySQL服务器在某个时间点或者每隔一段时间自动执行某些语句。
创建事件
代码块 |
---|
CREATE EVENT 事件名 ON SCHEDULE { AT 某个确定的时间点 | EVERY 期望的时间间隔 [STARTS 开始日期和时间] [END 结束日期和时间] } DO BEGIN 具体的语句 END |
事件支持两种执行方式:在某个确定的时间点执行;每隔一段时间执行一次。
在某个确定的时间点执行,比如:
代码块 CREATE EVENT insert_t1_event ON SCHEDULE AT '2021-09-04 15:48:54' DO BEGIN INSERT INTO t1(m1, n1) VALUES(6, 'f'); END
也可以通过表达式来指定时间点,比如:
代码块 CREATE EVENT insert_t1_event ON SCHEDULE AT DATE_ADD(NOW(), INTERVAL 2 DAY) DO BEGIN INSERT INTO t1(m1, n1) VALUES(6, 'f'); END
- 每隔一段时间执行一次,比如:
代码块 CREATE EVENT insert_t1_event ON SCHEDULE EVERY 1 HOUR DO BEGIN INSERT INTO t1(m1, n1) VALUES(6, 'f'); END
目录 |
---|