博客
关于我
MySQL高级-触发器
阅读量:790 次
发布时间:2023-02-13

本文共 2392 字,大约阅读时间需要 7 分钟。

数据库触发器详解

触发器是一种与数据库表相关的数据库对象,用于在 insertupdatedelete 操作之前或之后,自动触发并执行定义的SQL语句集合。类似于JavaScript中的事件处理,触发器可以用来确保数据的完整性、执行日志记录、数据校验等任务。

触发器类型

触发器根据触发操作的类型主要分为以下几种:

1. INSERT 型触发器

  • 特点:在插入新数据时触发
  • 引用:使用 NEW 来引用将要或已经插入的数据记录

2. UPDATE 型触发器

  • 特点:在更新数据时触发
  • 引用:使用 OLD 表示修改前的数据,NEW 表示修改后的数据

3. DELETE 型触发器

  • 特点:在删除数据时触发
  • 引用:使用 OLD 来引用将要或已经删除的数据记录

创建触发器

触发器的创建语法结构如下:

create trigger trigger_name before/after insert/update/delete on tbl_name [for each row] begin    -- 触发器脚本内容    trigger_stmt;end$

示例:记录员工表的操作日志

第一步:创建日志表

create table emp_logs (    id int(11) not null auto_increment comment '日志ID',    operation varchar(20) not null comment '操作类型:insert/update/delete',    operate_time datetime not null comment '操作时间',    operate_id int(11) not null comment '操作表的ID',    operate_params varchar(500) comment '操作参数',    primary key (`id`)) engine=innodb default charset=utf8;

第二步:创建插入类型触发器

DELIMITER $$create trigger emp_logs_insert_trigger after insert on emp for each row begin    insert into emp_logs (        id, operation, operate_time, operate_id, operate_params    ) values (        null, 'insert', now(), new.id, concat('插入后(id:', new.id, ', name:', new.name, ', age:', new.age, ', salary:', new.salary, ')')    );end $$DELIMITER ;

第三步:创建更新类型触发器

DELIMITER $$create trigger emp_logs_update_trigger after update on emp for each row begin    insert into emp_logs (        id, operation, operate_time, operate_id, operate_params    ) values (        null, 'update', now(), new.id, concat('修改前(id:', old.id, ', name:', old.name, ', age:', old.age, ', salary:', old.salary, ') , 修改后(id:', new.id, ', name:', new.name, ', age:', new.age, ', salary:', new.salary, ')')    );end $$DELIMITER ;

第四步:创建删除类型触发器

DELIMITER $$create trigger emp_logs_delete_trigger after delete on emp for each row begin    insert into emp_logs (        id, operation, operate_time, operate_id, operate_params    ) values (        null, 'delete', now(), old.id, concat('删除前(id:', old.id, ', name:', old.name, ', age:', old.age, ', salary:', old.salary, ')')    );end $$DELIMITER ;

测试

insert into emp(id, name, age, salary) values(null, '光明左使', 30, 3500);insert into emp(id, name, age, salary) values(null, '光明右使', 33, 3200);update emp set age = 39 where id = 3;delete from emp where id = 5;

删除触发器

删除触发器的语法结构如下:

drop trigger [schema_name.]trigger_name

如果没有指定 schema_name,则默认为当前数据库。

查看触发器

可以通过执行 show triggers 命令查看触发器的状态和相关信息。

show triggers;

转载地址:http://wedfk.baihongyu.com/

你可能感兴趣的文章
mysql查询慢排查
查看>>
MySQL查询报错ERROR:No query specified
查看>>
mysql查询数据库储存数据的占用容量大小
查看>>
MySQL查询数据库所有表名及其注释
查看>>
MySQL查询数据表中数据记录(包括多表查询)
查看>>
MYSQL查询语句优化
查看>>
mysql查询语句能否让一个字段不显示出来_天天写order by,你知道Mysql底层执行原理吗?
查看>>
MySQL死锁套路:一次诡异的批量插入死锁问题分析
查看>>
Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction
查看>>
mysql每个数据库的最大连接数_MySQL数据库最大连接数
查看>>
Mysql流程控制结构,if函数、case结构、if结构、循环结构
查看>>
mysql添加用户
查看>>
MySQL添加用户、删除用户与授权
查看>>
mysql添加用户及权限
查看>>
Mysql添加用户并授予只能查询权限
查看>>
mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决
查看>>
mysql添加索引
查看>>
mysql添加表注释、字段注释、查看与修改注释
查看>>
mysql清空带外键的表
查看>>
mysql源码安装
查看>>