Mysql触发器语法解读(附带简单实用例子)

 更新时间:2023年08月30日 11:01:17   作者:good_good_xiu  
这篇文章主要介绍了Mysql触发器语法解读(附带简单实用例子),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

触发器语法

  • DEFINER:定义该触发器的用户和主机地址,一般默认为当前用户和主机地址。
  • trigger_name:触发器名称 AFTER|BEFORE:触发器触发状态,二选一。
  • INSERT|UPDATE|DELETE:触发器触发状态,三选一。
  • table_name:监控的数据表名称。
  • FOR EACH ROW:行级触发器,修改一行数据触发一次。不写就默认语句级触发器,不管修改多少行数据,只执行一次。
-- 数据库操作工具方法(navicat、sqlyog)
CREATE DEFINER=`root`@`localhost` TRIGGER trigger_name AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW -- 行级触发器,修改一行数据触发一次。不写就默认语句级触发器,不管修改多少行数据,只执行一次。
BEGIN
	... -- 具体执行语句
END

命令行方式

-- 命令行方式
--先更改语句结束符号
delimiter ##  -- 切换自定义结束符号,在可视化操作页面不需要,在命令行中创建触发器则需要。
-- 再创建触发器
CREATE TRIGGER trigger_name AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW -- 行级触发器
BEGIN
	... -- 具体执行语句
END
## -- 代表创建触发器语句结束,这样就不会执行到分号;的时候暂停执行了。
delimiter ; --恢复mysql默认语句结束符号

实用案例(常用after类型触发器)

before触发器一般用于在操作数据前,对新数据的值进行修改。

例如:

考试时长计算,set new.考试时长 = new endtime - new starttime(很少使用)

-- 在插入bysj_et表后触发
DROP TRIGGER if EXISTS testi; -- 如果存在testi触发器则删除
CREATE TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	INSERT INTO bysj_dt VALUES (new.id,new.et_name);
END
-- 在删除bysj_et表后触发
DROP TRIGGER if EXISTS testd; -- 如果存在testd触发器则删除
CREATE TRIGGER testd AFTER DELETE ON bysj_et
FOR EACH ROW
BEGIN
	DELETE FROM bysj_dt WHERE id = old.id AND dt_name = old.et_name;
END
-- 在更新bysj_et表后触发
DROP TRIGGER if EXISTS testu; -- 如果存在testu触发器则删除
CREATE TRIGGER testu AFTER UPDATE ON bysj_et
FOR EACH ROW
BEGIN
	-- SET @oid = old.id; -- 获取更新前旧数据行id
	-- SET @odt_name = old.et_name; -- 获取更新前旧数据行et_name
	-- SET @nid = new.id; -- 获取新数据行id
	-- SET @ndt_name = new.et_name; -- 获取新数据行et_name
	--UPDATE bysj_dt SET id = @nid,dt_name = @ndt_name WHERE id = @oid AND dt_name = @odt_name; --具体执行语句
	-- 上面的语句熟悉了之后可以优化成下面这样
	UPDATE bysj_dt SET id = new.id,dt_name = new.et_name WHERE id = old.id AND dt_name = old.et_name;
END

总结(踩坑记录)

1.new.字段的值可以在before类型的触发器中进行赋值和取值,在after类型触发器中只能取值。(在after类型触发器中进行对new数据行赋值操作会报错。因为after是在操作之后,已经产生了新数据行,不可修改。)

2.在insert操作中,只有new数据行,没有old数据行。(使用old关键字会报错)

3.在update操作中,new数据行和old数据行存在。

4.在delete操作中,只有old数据行。(使用new关键字会报错)

5.在mysql5.7之前的版本,同一张表中,不能存在两个类型一样的触发器。如果想在一个触发器种实现两种不同的处理语句执行,可以增加条件判断。

例如:使用if语句

CREATE DEFINER=`root`@`localhost` TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	IF(new.id = 6) -- 当新id为6时
	THEN IF(new.et_name = '6') -- 当新id为6,并且name也为6才执行插入语句
		THEN INSERT INTO bysj_dt VALUES (new.id,new.et_name);
		END IF;
	END IF;
END;

或使用case when语句

CREATE DEFINER=`root`@`localhost` TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	CASE 
	WHEN new.id = 6 AND new.et_name = '6' THEN
		INSERT INTO bysj_dt VALUES (new.id,'等于6');
	WHEN new.id < 6 THEN
		INSERT INTO bysj_dt VALUES (new.id,'小于6');
	ELSE
		INSERT INTO bysj_dt VALUES (100,'100');
END CASE;
END

6.在mysql5.7之后的版本可以存在两个类型的触发器。

但是要注意主键策略问题,两个触发器执行语句都为新增,当新增数据表的某列为主键时,第二次插入同样的数据就会报错。

id为6的新数据不能插入bysj_dt表两次。

7.在mysql中,只存在6种触发器。(before insert、before update、before delete、after insert、after update、after delete)

8.查看所有触发器:show triggers;

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql数据库远程访问设置方法

    mysql数据库远程访问设置方法

    MySQL数据库不允许从远程访问怎么办?本文提供了三种解决方法,需要的朋友可以参考下
    2008-02-02
  • MySQL如何快速定位慢SQL的实战

    MySQL如何快速定位慢SQL的实战

    在项目中我们会经常遇到慢查询,当我们遇到慢查询的时候一般都要开启慢查询日志,本文主要介绍了MySQL如何快速定位慢SQL的实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 如何修改mysql的隔离级别

    如何修改mysql的隔离级别

    MySQL的隔离级别是指数据库事务的隔离程度,用于控制并发事务之间的相互影响,本文就详细的介绍一下如何修改mysql的隔离级别,感兴趣的可以了解一下
    2023-08-08
  • Mysql Error 1826:Duplicate foreign key constraint错误问题及解决

    Mysql Error 1826:Duplicate foreign key&n

    MySQL1826错误是由于在创建表时,外键索引名重复导致的,解决办法是在创建外键时指定不同的索引名,或修改ForeignKeyName,此问题需注意索引和外键名称的唯一性
    2026-05-05
  • MySQL中删除重复数据的简单方法

    MySQL中删除重复数据的简单方法

    这篇文章主要介绍了MySQL中删除重复数据的简单方法,比起一般的NOT IN语句的效率更为高,需要的朋友可以参考下
    2015-05-05
  • mysql 性能的检查和调优方法

    mysql 性能的检查和调优方法

    我一直是使用mysql这个数据库软件,它工作比较稳定,效率也很高。
    2009-05-05
  • MySQL8.0 MGR的维护管理

    MySQL8.0 MGR的维护管理

    数据库已成为企业和管理员们最为关注的核心组件之一,本文主要介绍了MySQL8.0 MGR的维护管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • MySQL数据库多表操作通关指南(外键约束和多表联合查询)

    MySQL数据库多表操作通关指南(外键约束和多表联合查询)

    看再多的资料不如自己亲自动手实战,往往实战才能渗透知识,下面这篇文章主要给大家介绍了关于MySQL数据库多表操作的相关资料,包含外键约束和多表联合查询等,需要的朋友可以参考下
    2022-06-06
  • MYSQL开启远程访问权限的方法

    MYSQL开启远程访问权限的方法

    在本篇文章里小编给大家整理的是关于MYSQL开启远程访问权限的方法,对此有兴趣的朋友们可以跟着学习下。
    2020-02-02
  • MySQL正确修改最大连接数的3种方案

    MySQL正确修改最大连接数的3种方案

    这篇文章主要给大家介绍了关于MySQL正确修改最大连接数的3种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论