首页 > 数据库 >MySQL触发器

MySQL触发器

时间:2023-11-22 13:56:59浏览次数:46  
标签:触发 触发器 old insert xld MySQL new

触发器

1. 触发器概述

  • MySql 从 5.0.2 版本开始支持触发器。MySql 的触发器和存储过程一样,都是嵌入到MySql服务器的一段程序。
  • 触发器是由事件来触发某个操作,这些事件包括insert,update,delete事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。
  • 当对数据表中的数据执行插入,更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

2. 触发器的创建

2.1 创建触发器语法

创建触发器的语法结构:

create trigger 触发器名称
{before|after} {insert|update|delete} on 表名
for each row
# 触发体 触发器执行的语句块
....

例如

delimiter //
CREATE TRIGGER xld_insert_trigger
BEFORE INSERT ON xld	
FOR EACH ROW
BEGIN
INSERT INTO xld_log(log) VALUES ('xld.insert.before.log');
END //
delimiter ;

说明:

表名:表示触发器监控的对象。

before|after:表示触发器的时间,before 表示在事件之前触发; after 表示在事件之后触发;

insert|update|delete:表示触发的事件。

​ 1. insert 表示插入记录时触发

​ 2. update 表示更新记录时触发

​ 3. delete 表示删除记录时触发

触发器执行的语句块:可以在单条SQL语句,也可以是由 begin...end 结构组成的复合语句块。

2.2 old 和 new

触发器针对的是数据表中的每条记录(每行),每行在数据操作前后都有一个对应的状态,触发器在执行之前就将对应的状态获取到了,将没有操作之前的状态(数据)都保存到old关键字中(旧的数据),而操作后的状态都放到new中(新的数据)。

  • old:表示将要被删除或者修改的原数据
old.字段名称
# 例如
old.xld_name
  • new:表示将要被插入或者修改的新数据
new.字段名称
# 例如
new.xld_name

注意:old 是只读的,而 new 则可以在触发器中使用 SET 再次赋值,这样不会再次触发触发器,造成循环调用。

注意:old 和 new 并不是所有触发器都有

  • insert:数据插入前后,都没有old
  • delete:清空数据,没有new
  • update:修改数据,即有 old 也有 new

3. 查看,删除触发器

3.1 查看触发器

查看触发器是查看数据库中已经存在的触发器的定义,状态和语法信息。

  • 方式1:查看当前数据库的所有触发器的定义
show triggers;
# 例如
SHOW TRIGGERS
  • 方式2:查看当前数据库某个触发器的定义
show create trigger 触发器名称;
# 例如
SHOW CREATE TRIGGER xld_insert_trigger;
  • 方式3:从系统库information_schema 的 TRIGGERS 表中查询触发器的信息。
SELECT * FROM information_schema.`TRIGGERS`

3.2 删除触发器

触发器也是数据库对象,删除触发器也用 drop 语句。格式如下:

drop trigger if exists 触发器名称;
# 例如
DROP TRIGGER IF EXISTS xld_insert_trigger;

4. 触发器的优缺点

4.1 优点

  • 触发器可以确保数据的完整性(保证存在关联的两张或多张表的数据完整性)
  • 触发器可以帮助我们记录操作的日志
  • 触发器还可以用在操作数据前,对数据进行合法性检查

4.2 缺点

  • 触发器最大一个问题就是可读性差
  • 相关数据的变更,可能会导致触发器报错

4.3 注意点

注意。如果在字表中定义外键约束,并且外键指定了 鸥鸟update/delete cascade/set null 子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的update和delete语句定义的触发器并不会被触发。

总结一句话:就是表中的外键字段由于约束导致的 修改或删除 是无法触发触发器的执行的

MySql数据库自定义错误

语法结构:

signal sqlstate 'HY000' set message_text = '错误描述';

例如

SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '小林当的第一个错误!!!';

注意:sqlstate 应该必须为  ’HY000‘  的吧!不然会报错 [Err] 1407 - Bad SQLSTATE: 'HY000000'

标签:触发,触发器,old,insert,xld,MySQL,new
From: https://www.cnblogs.com/xiaolindang/p/17848841.html

相关文章

  • MySQL存储过程
    存储过程1.存储过程概述概述:存储过程的英文是"storedprocedure"。它的思想很简单,"就是一组经过"预先编译"的SQL语句的封装"。执行过程:存储过程预先存储在MySql服务器上,需要执行的时候,"客户端只需要向服务器端发送调用存储过程的命令",服务端就可以把预先存储好的这一系列......
  • MySQL视图
    视图(view)1.常见的数据库对象对象描述表(table)表是存储数据的单元,以行和列的形式存在,列就是字段,行就是记录数据字典(系统表)就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改,只能查看约束(constraint)执行数据校验的规则,......
  • mysql8下载安装及配置
    一、下载官网地址:https://dev.mysql.com/downloads/mysql/8.0.html选择“downloads”-->"mysqlcommunityserver",如下图所示:向下滑动页面,找到你电脑适配的版本,点击“download”,如下图:页面跳转,不需要注册和登陆,点击“Nothanks,juststartmydownload.......
  • mysql 处理 json 字段
    1.查看包含json字段的表信息mysql>desctab_json;+-------+------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------+------------+------+-----+---------+----------------+|id|bigint(20)......
  • 触发器dff与锁存器latch的用法和区别
    dff与latch的用法和区别废话少说,dff是边沿敏感,latch是电平敏感。用法上图:功能仿真: 以下部分是摘抄别人的技术心得:latch(锁存器)与DFF(D触发器)的区别1、latch由电平触发,非同步控制。在使能信号有效时latch相当于通路,在使能信号无效时latch保持输出状态。DFF由时钟沿触发,同......
  • java类转mysql表创建语句
    packagecn.eangaie.cloud.wx3562;importcn.hutool.core.io.FileUtil;importcn.hutool.core.lang.Console;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importio.swagger.annotations.ApiModelProper......
  • MySQL-重置主键自动递增值-从头开始
    如果你想要重置MySQL数据库中的AUTO_INCREMENT值并让它从头开始增加新的ID,请按照以下步骤进行操作:首先,确定你要修改的表格名和要修改的字段名。例如,假设你有一个名为“users”的表格,并且该表格中的主键字段名为“id”。然后,执行以下SQL命令来更改该字段的当前自动递增计数器:ALT......
  • mysql无法登陆,报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (
    问题描述在使用命令行登录MySQL时出现了下述问题: 出错原因usingpassword:NO:表示输入没有输入密码就尝试登陆了usingpassword:YES:表示输入了密码,但密码错误 解决方案:修改密码1.修改mysql配置文件my.cnf。在 [mysqld]增加skip-grant-tables 无密码进入mys......
  • 【MySQL】配置文件
    #Disablingsymbolic-linksisrecommendedtopreventassortedsecurityrisks#symbolic-links=0#Settingsuserandgroupareignoredwhensystemdisused.#Ifyouneedtorunmysqldunderadifferentuserorgroup,#customizeyoursystemdunitfilefor......
  • MySql 中 DATEDIFF() 用法
    DATEDIFF函数用于计算两个日期之间的差值,并以天数返回结果。它的语法如下:DATEDIFF(end_date,start_date)其中,end_date和start_date是要计算差值的结束日期和起始日期。以下是一个示例,计算两个日期之间的天数差值:SELECTDATEDIFF('2023-11-21','2023-11-01')ASdays_di......