加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL之如何使用触发器

发布时间:2022-12-15 15:05:05 所属栏目:MySql教程 来源:转载
导读: 触发器:它是一个特殊的存储过程,它是MySQL在insert、update、delete的时候执行,自动执行,不能直接调用。
它包含四个要素:
监视地点(table)
监视事件(insert/update/delete)
触发时

触发器:它是一个特殊的存储过程,它是MySQL在insert、update、delete的时候执行,自动执行,不能直接调用。

它包含四个要素:

监视地点(table)

监视事件(insert/update/delete)

触发时间(after/before)

触发事件(insert/update/delete)

触发器语法:

    create trigger trigger_name
    after/before   insert/update/delete on tb_name
    for each row
    begin
    sql 语句:(触发的语句一句或者多句)
    end;

现有两张表 商品表 goods 和订单表 order 来说明触发器的工作原理;

MySQL之如何使用触发器

()

我们现在往goods表添加四条记录:

 insert into goods (goods_name,goods_num)values("手机",20),("电脑",30),("单反",20);

实现购买任意商品,对应的商品数量相应的减少:

分析:

监视地点:order 表

监视事件:insert操作

触发时间:在insert操作之后

触发事件:update操作

    CREATE TRIGGER t1
    AFTER  INSERT ON `order`
    FOR EACH ROW
    BEGIN
    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
    END;

如 我们购买5个手机:

INSERT INTO order (goods_id,order_num) VALUES(1,5);

注:对于insert 而言 新增的行使用new 来表示,行中的每一列的值用 new.列名来表示

这时我们会发现goods表、order表的数据如下:

MySQL之如何使用触发器

()

2.撤销订单:

分析:

监视地点:order 表

监视事件:delete操作

触发时间:在delete操作之后

触发事件:update操作

    DROP TRIGGER if EXISTS t1;
    CREATE TRIGGER t1
    AFTER DELETE ON `order`
    FOR EACH ROW
    BEGIN
    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
    END;

现在要取消刚才买的5个手机的订单:

DELETE FROM order WHERE order_id=1;

注:对于delete而言 删除的行使用old 来表示mysql触发器, 行中的每一列的值用 old.列名来表示

这时我们会发现goods表、order表的数据发生了如下的变化:

MySQL之如何使用触发器

()

修改订单(包括修改购买的数量以及购买的商品)

分两步:

撤销订单;(delete);

新增订单:(insert);

    DROP TRIGGER if EXISTS t1;
    CREATE TRIGGER t1
    AFTER UPDATE ON `order`
    FOR EACH ROW
    BEGIN
    #撤销订单
    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
    #新增订单
    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
    END;

UPDATE `order` SET goods_id=2,order_num=4 WHERE order_id=2;
现在看下两张表的变化:
[![MySQL之如何使用触发器](http://upload-images.jianshu.io/upload_images/11222021-ac615935f8bf6d7a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=7) 

()

注意:

如果在执行创建触发器的时候语句报错

那在 语句之前添加

delimiter $$
CREATE TRIGGER t1
AFTER  INSERT ON order
...

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!