触发器
引入
事件情况
- 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;
- 每当订购一个产品时,都从库存数量中减去订购的数量;
- 无论何时删除一行,都在某个存档表中保留一个副本。
所有这些例子的共同之处是它们都需要在某个表发生更改时自动处理。这确切地说就是触发器。
触发器的定义
触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,会激活促发其执行相应的操作。
事件类型
增删改三个类型。
触发时间
前后:before和after。
触发对象
表中的每一条记录(行)。
一张表中只能拥有一种触发时间的一种类型的触发器,最多一张表能有6个触发器。
触发器创建
语法
CREATE [OR REPLACE] TRIGGER Trigger_name
{BEFORE |AFTER} Triggering_event ON table_name
[FOR EACH ROW]
[FOLLOWS another_trigger]
[ENABLE/DISABLE]
[WHEN condition]
DECLARE
declaration statements
BEGIN
executable statements
EXCEPTION
exception-handling statements
END;
创建
delimiter //
CREATE TRIGGER stock_change AFTER INSERT ON my_order FOR EACH ROW
BEGIN
UPDATE my_stock s SET s.p_stock = s.p_stock - 1 WHERE s.p_id = 1;
END //
查看触发器
查看所有触发器:
show triggers;
查看触发器创建语言
show create trigger 触发器名字
show create trigger stock_change;
所有的触发器都会保存一张表中:Information_schema.triggers
SELECT * FROM Information_schema.triggers; -- 可查询
使用触发器
触发器不需要手动调用,而是当某种情况发生时会自动触发。(当往my_order表中插入数据时,触发器发动,my_stock表存货会减少。)
删除触发器
通过使用触发器,发现我们之前建立的触发器并没有用,于是先将他删除再结合触发器记录所学的知识创建一个新的可用的触发器。
删除
-- drop trigger 触发器名字
drop trigger stock_change;
触发器记录
记录
触发器记录:不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用:其中,要操作的记录的当前状态保存到old中,操作之后的可能形态保存给new。
old代表的是旧纪录,new代表的是新纪录。删除的时候是没有new的,插入的时候是没有old的。
old和new都是代表记录本身:任何一条记录除了有数据,还有字段名字。
使用方法:old.字段名
/new.字段名
修改
通过使用发现之前创建的触发器是错误的,不能起到需要的作用,现通过触发器记录来修改这个程序:
delimiter //
CREATE TRIGGER stock_change AFTER INSERT ON my_order FOR EACH ROW
BEGIN
UPDATE my_stock s SET s.p_stock = s.p_stock - new.p_number WHERE s.p_id = new.p_id;
END //
文末附建表查询
-- 创建库存表
CREATE TABLE my_stock(
p_id int PRIMARY KEY COMMENT '产品编号' auto_increment,
p_name VARCHAR(32) COMMENT '产品名' not null,
p_price DECIMAL(7,2) COMMENT '产品价格' DEFAULT 1,
p_stock int COMMENT '产品库存')CHARSET utf8;
-- 创建订单表
CREATE TABLE my_order(
id int PRIMARY KEY COMMENT '订单号' auto_increment,
p_id int COMMENT '商品id',
p_number int COMMENT '商品数量');
-- 插入库存信息
INSERT INTO my_stock VALUES (1,'小米10',3999,100),
(2,'华为p40',4999,110),
(3,'iphone x',5000,80),
(4,'iphone 7',1000,10);
注:学习资源来源up主满满的思绪呀