[MySQL光速入门]026 触发器 trigger!!!

什么是触发器

就是trigger(扳机), 一碰就动, 一触即发, 就叫触发器sql

跟存储过程相似, 也是主要用于增, 删, 改数据库

事先为某张表绑定一段代码, 当表中的某些内容发生改变的时候(对表进行增删改), 系统就会自动触发代码执行函数

监听, 只要...就触发, 而后执行...post

触发器.png

为何须要触发器?

有些sql语句, 或者数据库操做, 在逻辑上是紧密相关, 不可分割的, 须要一块儿执行测试

建立触发器

建立触发器.png

咱们须要一些测试数据ui

drop database if exists mail;

create database mail character set utf8;

use mail;

create table goods(
    goods_id int primary key,
    goods_name varchar(20) not null,
    goods_inventory int not null
);

create table orders(
    orders_id int primary key,
    orders_goods_id int not null,
    orders_buy_number int not null,
    foreign key(orders_goods_id) references goods(goods_id)
);



insert into goods set goods_id = 1, goods_name = 'television', goods_inventory = 20;
insert into goods set goods_id = 2, goods_name = 'bicyle', goods_inventory = 99;

insert into orders set orders_id = 1, orders_goods_id = 1, orders_buy_number = 2;
insert into orders set orders_id = 2, orders_goods_id = 2, orders_buy_number = 10;
复制代码

中文版spa

drop database if exists 商城数据库;

create database 商城数据库 character set utf8;

use 商城数据库;

create table 商品表(
    商品ID int primary key,
    商品名称 varchar(20) not null,
    商品库存 int not null
);

create table 订单表(
    订单ID int primary key,
    订单里的商品ID int not null,
    订单里的商品购买数量 int not null,
    foreign key(订单里的商品ID) references 商品表(商品ID)
);



insert into 商品表 set 商品ID = 1, 商品名称 = '电视机', 商品库存 = 20;
insert into 商品表 set 商品ID = 2, 商品名称 = '自行车', 商品库存 = 99;

insert into 订单表 set 订单ID = 1, 订单里的商品ID = 1, 订单里的商品购买数量 = 2;
insert into 订单表 set 订单ID = 2, 订单里的商品ID = 2, 订单里的商品购买数量 = 10;
复制代码

商城数据库.png

insert

insert以前(语法)

drop trigger if exists 插入前触发;
create trigger 插入前触发 before insert on teacher for each row
   -- sql语句, 不能是select
begin
  
end;
复制代码

insert以后(语法)

drop trigger if exists 插入后触发;
create trigger 插入后触发 after insert on teacher for each row
begin
    -- sql语句, 不能是select
end;
复制代码

咱们的需求, 当订单表里新增订单以后, 商品表里的库存须要相应减小3d

drop trigger if exists change_inventory;

create trigger change_inventory after insert on orders for each ROW begin 
    update goods 
    set 
        goods_inventory = goods_inventory - new.orders_buy_number 
    where 
        goods_id = new.orders_goods_id;
end;

insert into orders 
set 
    orders_id = 3, 
    orders_goods_id = 1, 
    orders_buy_number = 3;
复制代码

中文版code

drop trigger if exists 更改库存;

create trigger 更改库存 after insert on 订单表 for each ROW begin 
    update 商品表 
    set 
        商品库存 = 商品库存 - new.订单表里的商品购买数量 
    where 
        商品ID = new.订单里的商品ID;
end;

insert into 订单表 
set 
    订单ID = 3, 
    订单里的商品ID = 1, 
    订单表里的商品购买数量 = 3;
复制代码

image.png

image.png

image.png

Snipaste_2019-04-13_17-48-39_看图王.png

delete

若是订单取消, 商品的库存应该恢复cdn

image.png

image.png

咱们编写一个触发器, 若是订单取消, 则电视机的库存恢复到原来的20

drop trigger if exists recover_inventory;

create trigger recover_inventory after delete on orders for each row begin 
    update goods 
    set goods_inventory = goods_inventory + old.orders_buy_number 
    where goods_id = old.orders_goods_id;
end;

delete from orders where orders_id = 3;
复制代码

中文版

drop trigger if exists 恢复库存;

create trigger 恢复库存 after delete on 订单表 for each row begin 
    update 商品表 
    set 商品库存 = 商品库存 + old.订单表里的商品购买数量 
    where 商品ID = old.订单里的商品ID;
end;

delete from 订单表 where 订单ID = 3;
复制代码

image.png

image.png

查看触发器

查看全部触发器

show triggers;
复制代码

image.png

查看触发器建立语句

show create trigger 触发器名称;
复制代码

image.png

删除&修改触发器

触发器不能修改, 只能先删除, 再修改

drop trigger 触发器名称;
复制代码

最后说明

  1. 触发器中, 只能有增删改, 不能有查
  2. 触发器中只能对非监听的表, 进行增删改, 避免死循环
  3. 触发器的监听对象,并不都有new和old

trigger监听对象

监听对象.png

快速跳转

相关文章
相关标签/搜索