MySQL——How To Use Trigger(MySQL 中触发器的理解与使用——以及触发器在NEW表与OLD表的应用)

📖 MySQL——触发器 TRIGGER

摘录自 Water_Coder —— MySQL之 触发器 用于学习

修改学习 TimeFriends —— MySQL触发器

📑 什么是触发器 TRIGGER

什么是触发器 TRIGGER ?

数据库处理中使用的这个术语是指当在数据表中触发了某种操作或事件(插入、删除、更新操作),然后自动触发了预先编写好的若干条 SQL 语句执行

同时触发器也是一种特殊的存储过程(Stored Procedure) ,触发器和存储过程一样是一个能完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用.

📑 触发器的特点及作用

📚特点触发事件的操作 和 触发器里面的 SQL 语句是同一个事物操作具有原子性(atomicity),要么全部执行,要么都不执行。

📚作用可以保证数据的完整性,起到 约束 作用。同时触发器的特点与作用可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作.

📑 触发器的创建

语法

CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW [trigger_order]
trigger_body

语法说明

Trigger_time: 触发器执行时间: AFTER | BEFORE
Trigger_event: 触发器触发的事件: INSERT | UPDATE | DELETE
FOR EACH ROW: 表示任何一条记录上的操作满足触发事件都会触发该触发器
Table_name: 表示触发事件操作表的名字
Trigger_body: 创建触发器的 SQL 语句

📑 场景实战

当商场对其商品库存信息 inventory_info 进行改动时,将变化添加到对应的库存信息日志中 inventory_logs,以便于大数据信息统计用户购买倾向,进行商品推荐。

步骤一:创建两张表简单模拟场景

-- 创建 inventory_info 表
CREATE TABLE `inventory_info`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(64) NOT NULL,
  `product_quantity` int(0) NOT NULL,
  PRIMARY KEY (`id`) 
) ENGINE = InnoDB CHARACTER SET = utf8;

-- 创建 inventory_logs 表
CREATE TABLE `inventory_logs`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `operate` varchar(64) NOT NULL,
  `date` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
  `product_id` int(0) NOT NULL,
  PRIMARY KEY (`id`) 
) ENGINE = InnoDB CHARACTER SET = utf8;

步骤二:为 inventory_info 表插入两条数据

INSERT INTO `trigger_test`.`inventory_info`(`id`, `product_name`, `product_quantity`) VALUES (1, 'Milk', 55);
INSERT INTO `trigger_test`.`inventory_info`(`id`, `product_name`, `product_quantity`) VALUES (2, 'Book', 11);

创建一个名为 inventorylogs_trigger 的触发器

当名为 inventory_info 的表发生更新操作时 执行 BEGIN - END 的SQL 语句结构体

DELIMITER $$
CREATE TRIGGER inventorylogs_trigger AFTER update
ON inventory_info FOR EACH ROW
BEGIN
	INSERT INTO `inventory_logs`(`operate`, `date`, `product_id`) VALUES ('update', NOW(), OLD.id);
END $$
DELIMITER $$;

触发器会根据 inventory_info 表的数据修改会自动执行 INSERT 语句 添加一条日志记录到 inventory_logs 中

📑 查看当前已有触发器

-- 查看所有的触发器
SHOW TRIGGERS;
-- 可以查看 名为 trigger_name 的触发器的详细信息
SHOW CREATE TRIGGER trigger_name; 

📑 触发器在 NEW 表 与 OLD 表的应用

MySQL 中 定义了 NEWOLD 两个临时表,用来表示 触发器的所在表中,触发了触发器的哪一行数据,来引用触发器中 发生变化的记录内容,具体地:

  • INSERT 型触发器中,NEW 用来拦截并保存将要(BEFORE)或已经(AFTER)插入的新数据;
  • UPDATE 型触发器中,OLD用来拦截并保存将要或已经被修改的原数据,NEW 用来拦截并保存将要或已经修改为的新数据。
  • DELETE 型触发器中,OLD 用来拦截并保存将要或已经被删除的原数据。

📑 删除已有触发器

# 删除名为 trigger_name 的触发器
DROP TRIGGER if exists trigger_name;

📑 注意事项

  • 需要尽量少使用触发器,当数据表中的数据每发生改变都会执行触发器,对于增删改查较频繁的业务等,切记一定不要使用触发器,占用CPU的同时对于用户响应的体验也很差。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值