MySQL 学习笔记 2:触发器

本文介绍了MySQL中的触发器,它们在数据库操作如INSERT、UPDATE、DELETE时自动执行指定的SQL语句。触发器可用于日志记录、数据验证等,文章通过示例详细解释了如何创建、修改和删除触发器,并讨论了其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL 学习笔记 2:触发器

image-20230710222532579

图源:ubiq.co

触发器,就像字面意思那样,它会在数据库某些事件发生时执行一些操作。

具体来说,触发器会在特定表的INSERTUPDATEDELETE这些类型的 SQL 语句执行时被“触发”,并执行触发器中定义好的(一条或多条) SQL 语句。

在 MySQL 中,触发器存在一些限制,我们只能对同一张表定义最多6个触发器,分别对应6个事件:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE

此外,无法在触发器中调用存储过程,也无法对临时表和视图使用存储过程。

本文使用的数据库可视化工具和测试数据同上一篇文章,不再赘述。

创建触发器

用 SQLyog 创建触发器会有类似下面这样的模版:

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `jpa`.`afterStudentAdd` BEFORE/AFTER INSERT/UPDATE/DELETE
    ON `jpa`.`<Table Name>`
    FOR EACH ROW BEGIN

    END$$

DELIMITER ;

这里的afterStudentAdd是我们的触发器名称,名称后需要指明执行触发器的事件,也就是前面说过的6种事件之一,这里我们要按需要修改。ON后是触发器关联的数据库和表,这里要填写需要触发器的表名。FOR EACH ROW说明每一条数据触发事件后都会执行触发器内的 SQL。最后,在BEGINEND之间填写触发器的 SQL,如果只有一条 SQL 要执行,BEGINEND可以省略。

原则上同一张表的触发器名称唯一即可,但作为良好习惯,触发器名称应该在数据库中唯一。

INSERT

下面是我编写的触发器:

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `jpa`.`afterStudentAdd`  AFTER INSERT
    ON `jpa`.`student`
    FOR EACH ROW BEGIN
        declare nowTime datetime default NOW();
        INSERT INTO `jpa`.`student_add_log` (`id`, `average_score`, `level`, `name`, `time`) VALUES (NEW.id, NEW.average_score, NEW.level, NEW.name, nowTime);
    END$$

DELIMITER ;

这个触发器将在INSERT语句执行后执行,作用是将新添加的数据插入一个日志表student_add_log,并且记录添加时间。在 INSERT 事件中,我们可以使用临时表NEW获取新添加的数据。需要注意的是,自增主键只有在数据真正添加后(INSERT语句执行后)才会产生,所以类似的NEW.id只有在AFTER INSERT事件中才能获取到,BEFORE INSERT中是不存在的。

实际上这里的局部变量nowTime并不是必须的。

日志表的表结构如下:

CREATE TABLE `student_add_log` (
  `id` bigint NOT NULL,
  `average_score` int NOT NULL,
  `level` enum('FRESH_MAN','JUNIOR',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值