触发器

触发器也是存储例程中的一种,用于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语句来说,影响的记录是那些准备插入的新记录;
    • 对于DELETEUPDATE语句来说,影响的记录是符合WHERE条件的记录(如果没有WHERE,则表示全部记录);


MySQL提供了NEWOLD两个单词来代表新记录和旧记录的值,它们的含义如下:

  • 对于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服务器在某个时间点或者每隔一段时间自动执行某些语句。

创建定时事件需要开启以下选项:

SET GLOBAL event_scheduler = ON;


创建事件

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

    还可以指定重复执行的起始时间和结束时间,比如:

    CREATE EVENT insert_t1_event
    ON SCHEDULE
    EVERY 1 HOUR STARTS '2021-09-04 15:48:54' ENDS '2021-09-16 15:48:54'
    DO
    BEGIN
    	INSERT INTO t1(m1, n1) VALUES(6, 'f');
    END

    上面的事件将从'2021-09-04 15:48:54'开始,到'2021-09-16 15:48:54'结束,期间每隔1小时执行一次。

查看和删除事件

查看:

SHOW EVENTS

查看定义:

SHOW CREATE EVENT 事件名

删除:

DROP EVENT 事件名



















  • 无标签