MySQL触发器实现多表操作

create trigger <触发器名称>on<表名称> for each row <触发器主体>

触发器与事件的差别:事件是基于特定时间周期来执行的,触发器是基于某个表所产生的事件触发,事件也称之为临时触发器。

mysql支持的触发器有3种:INSERT, UPDATE, DELETE,加上BEFORE,AFTER 2种触发,3*2组合一共6种,也就意味着一张表最多支持6个触发器。

触发器也能够触发外部函数,这个属于高级应用的范畴了,这里暂时不讨论。

MySQL触发器实现多表操作_第1张图片

 设计一个名称为tr_emp的触发器,完成的功能是:当删除部门表中的记录时,将职工表中的部门信息置空。

CREATE trigger tr_emp after DELETE ON tb_dept FOR EACH row
UPDATE tb_employee 
SET deptno='' 
WHERE deptno=(select deptno from tb_dept);

-------------------------------------------------------------------------------------------------------------

-- 创建表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
price decimal(10,2) default 1,
inv int comment '库存数量')charset utf8;

insert into my_goods values(null,'iPhone6s',5288,100),(null,'s6','6088',100);

create table my_order(
id int primary key auto_increment,
g_id int not null comment '商品ID',
g_number int comment '商品数量'
)charset utf8;

MySQL触发器实现多表操作_第2张图片

-- 触发器: 订单生成一个, 商品库存减少

-- 临时修改语句结束符
delimiter $$

create trigger after_order after insert on my_order for each row
begin
    -- 触发器内容开始
    update my_goods set inv = inv - 1 where id = 2;
   
end
-- 结束触发器
$$

-----------------------------------------------------------------

-- 触发器: 订单生成一个, 商品库存减少

-- 临时修改语句结束符
delimiter $$

create trigger after_order after insert on my_order for each row
begin
    -- 触发器内容开始: 新增一条订单: old没有,new代表新的订单记录
    update my_goods set inv = inv - new.g_number where id = new.g_id;
   
end
-- 结束触发器
$$

-------------------------------------------------------------------

create trigger before_order before insert on my_order for each row
begin
    -- 判断商品库存是否足够

    -- 获取商品库存: 商品库存在表中
    select inv from my_goods where id = new.g_id into @inv;

    -- 比较库存
    if @inv < new.g_number then
        -- 库存不够: 触发器没有提供一个能够阻止事件发生的能力(暴力报错)
        insert into XXX values(XXX);
        
    end if;

end

 

 

你可能感兴趣的:(mysql)