博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MySQL触发器

Posted on 2017-10-23 00:28  星_初落  阅读(296)  评论(0编辑  收藏  举报

trigger

Mysql中触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

有时在改变表的的某些数据,同时也希望其他相关表中的数据也改变,利用触发器就能满足这样的需求。运用触发器不公可以简化程序,而且可以增加程序的灵活性。

创建触发器语法如下:

create trigger  name(触发器名称)

after/befor(触发时间)

insert/update/delete(触发事件,当填写其中一种,其它的操作不会激活触发器)

on (监视的表,即在哪张表上建立触发器 )

for each row (行级触发器)

begin

(sql语句,希望改变的数据,可写多条语句,每条语句必须用 ; 结尾)

end;

以上sql语句写上 ; 后就会执行,触发器未写完报错!

这时就会用到 DELIMITER 命令(delimiter 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法 为:

DELIMITER ;;(可以把mysql的结束标识设为其它的符号,如 ;; 或 $ 还可以设为多个长度)

在这之后的语句,以分号结束触发器不会有什么反应,只有遇到了 ;;,才认为是结束语句。注意:使用完之后,要记得把它修改回来!

 

假设系统中有两个表:
商品表 goods(商品ID gid, 商品名称 goods_name,商品数量 goods_num)
订单表 ord(订单oid ,商品ID gid,订单数量 goods_much )
要创建触发器来使商品表中的商品数量随着订单表的订单数量自动更新,代码如下:

delmiter $
#判断库存是否足够
create trigger t1
before
insert
on ord
for each row
begin
#声明变量
declare
goods_num int;
select num into goods_num from goods where gid = new.gid;
#判断
if new.much > goods_num then
    set new.much = goods_num;
end if;
update goods set num = num - new.much where gid=new.gid
end$
delmiter ;

MySQL 中使用 declare 来定义一局部变量,该变量只能在 BEGIN … END 复合语句中使用,并且应该定义在复合语句的开头,

上述示例中使用了NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
具体地:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;