触发器

作者: 陈智涛 | 来源:发表于2017-08-16 15:35 被阅读0次

    需求导入

    需求:
    现在有一张订单表和一张商品表,要求订单没增加一条,对应的商品的库存字段就减一

    触发器

    定义

    触发器:trigger,事先为某张表绑定一段代码,然后当表中的某些内容发生改变(增,删,改),系统会自动触发该代码,然后执行
    触发器分为:事件类型,触发时间,触发对象

    • 事件类型:
      增删改 insert delete update
    • 触发时间:
      前后,before和 after
    • 触发对象:
      表中的每一条记录(行)

    一张表中只能拥有一种触发时间的一种类型的触发器:即一张表最多有6个触发器

    创建触发器

    在mysql中没有{} ,[] 都是用对应的符号创建
    delimiter :自定义符号,后续代码中只有碰到自定义符号才算结束

    • 基本语法
    delimiter 自定义符号
    create trigger 触发器名字 触发时间 事件类型 on 表名 for each row 
    begin --左大括号开始
             --里面就是触发器的代码,枚举代码以';'结束
    end  --右大括号结束
    自定义符号      -- 语句结束符
    delimiter  ; -- 将临时修改修正过来
    

    示例:

    --创建商品表
    CREATE TABLE my_goods(
        id int PRIMARY key AUTO_INCREMENT,
        name VARCHAR (20) NOT null,
        price DECIMAL (10,2) DEFAULT 1,
        stock int COMMENT '库存'
       
    )charset utf8;
    
    INSERT INTO my_goods VALUES(null,'Iphone6s',5288,100),(null,'mate9',6288,100);
    
    --创建订单表
    CREATE TABLE my_order (
        id int PRIMARY KEY AUTO_INCREMENT ,
        good_id int NOT null COMMENT '商品id',
        good_num int not null COMMENT '商品数量'
    )charset utf8;
    
    --创建触发器 订单增加一个,商品库存减少一个
    
    DELIMITER $$
    CREATE TRIGGER after_order after insert on my_order for each row 
    BEGIN  -- 开始
        update my_goods set stock = stock-1 where id = 2;
    END 
    $$ -- 结束符
    DELIMITER  ; -- 修改临时结束符
    
    
    屏幕快照 2017-08-16 下午2.53.41.png

    查看触发器:

    • 查看所有或者模糊匹配
    show triggers [like 'pattern']
    
    • 查看触发器创建语句
    show create trigger 触发器名字
    

    所有的触发器都会保存在 information.schema.triggers 表中

    删除&修改触发器

    触发器不能修改,只能先删除后新增

    • 删除触发器
    drop trigger 触发器名字;
    
    drop TRIGGER after_order
    

    触发器记录

    屏幕快照 2017-08-16 下午3.21.58.png

    示例

    DELIMITER $$
    CREATE TRIGGER after_order after insert on my_order for each row 
    BEGIN  -- 开始
        -- 新增一条记录,old 没有,有new 
        update my_goods set stock = stock-new.good_num where id = new.good_id;
    END 
    $$ -- 结束符
    DELIMITER  ; -- 修改临时结束符
    
    INSERT INTO `my_order` values(null,1,4);
    
    屏幕快照 2017-08-16 下午3.30.03.png

    遗留问题:

    如果生成的订单导致库存不足,这个触发器是应该在生成订单前生成,那么怎么做?请参考下一小结
    “代码执行结构”

    相关文章

      网友评论

          本文标题:触发器

          本文链接:https://www.haomeiwen.com/subject/rvqirxtx.html