MySQL进阶--数据库的触发器详解

触发器详解

触发器(trigger)也称为触发程序,是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。——百度百科
MySQL进阶--数据库的触发器详解_第1张图片

(一)触发器语法

触发器在MySQL数据库中的关键字TRIGGER,创建触发器的语法如下:

在这里插入图片描述

• TRIGGER:触发器是与表有关的数据库对象,当表上出现****特定事件****时,将激活该对象的操作。

• tbl_name:触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与视图关联起来

• trigger_time:是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

• trigger_event指明了激活触发程序的语句的类型。

trigger_event:可以是下述值之一:

• INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

• UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

• DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

(二)触发器案例

商品购买生成订单,由于订单表的数据比较敏感,屏蔽其SQL操作,通过触发器将订单生成过程封装起来。

创建商品表、订单表:
MySQL进阶--数据库的触发器详解_第2张图片

初始化商品数据:
在这里插入图片描述

触发器需求:在购买商品时,修改商品库存数量,此时一旦库存数量发生更新,就自动生成订单:

补充: sql中声明局部变量

-- 格式:
declare 变量名  类型 [default]

-- 给变量赋值
set  变量名 =-- delimiter  修改默认sql语句结束符
--  \d  结束符

MySQL进阶--数据库的触发器详解_第3张图片

备注:由于MySQL一旦在语句中遇到;表示语句即刻执行

使用关键字DELIMITER 重 新 指 定 执 行 符 号 为 重新指定执行符号为 ,创建触发器的过程中直到遇到符号$$才会完整执行整段SQL语句,完成触发器的创建

执行SQL语句更新商品表中加湿器的库存数量
在这里插入图片描述

此时查询订单表,查看订单生成情况:

MySQL进阶--数据库的触发器详解_第4张图片

更新/购买的商品,已经形成订单,在订单表中存在了,并且更新了购买数量和小计金额。

练习:数据备份,当我们删除user表中的数据时,将删除的数据备份到,备份表

-- 练习:数据备份,当我们删除user表中的数据时,将删除的数据备份到,备份表
CREATE TRIGGER bak_trigger BEFORE DELETE ON user FOR EACH ROW
BEGIN
   -- 向备份表添加数据  old  是触发器内置的一个对象  代表旧的数据对象
	 insert into bak_user(id,name,gender) values(old.id,old.name,old.gender);
END; 

-- 删除user中的数据
delete from user  where id in (3,4);

练习:定义一个触发器,记录user表中数据的条数

-- 练习:定义一个触发器,记录user表中数据的条数
-- 每当我添加一条数据,cc  表中的count +=1
CREATE TRIGGER count_num AFTER INSERT ON user FOR EACH ROW 
BEGIN
  UPDATE cc SET count=count+1 WHERE id=1;
END;

INSERT INTO user(name) values('66'),('77');

总结:

​ 触发器,是给表去绑定的

​ 触发器是由指定的事件 自动触发 (insert update delete)

​ 触发器的触发时机: after before

​ 格式:

CREATE TRIGREE 触发器的名字(自定义的) 触发时机(after/before) 事件类型(insert/update/delete) ON 表名 FOR EACH  ROW
BEGIN
   触发器处理的内容;
END;

你可能感兴趣的:(MySql,基础和进阶,数据库,mysql,python,触发器)