• 技术文章 >数据库 >mysql教程

    关于MySQL触发器的问题

    一个新手一个新手2017-10-23 10:30:17原创1075

    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 用来表示将要或已经被删除的原数据;

    以上就是关于MySQL触发器的问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:MySQL 触发器 问题
    上一篇:关于SQL设置注册表的问题 下一篇:Windows10安装MySQL5.7及忘记root密码修改方法
    千万级数据并发解决方案

    相关文章推荐

    • mysql驱动是什么• mysql中字符串怎么转为整型• mysql怎么修改字段的字符集• mysql存储图片用什么类型• mysql中for update的用法是什么
    1/1

    PHP中文网