• 十一、触发器


    触发器:
    监听数据进行操作
    在当前的表上,设置一个对每行数据的一个监听器,监听相关事件
    每当事件发生时,会执行一段由sql完成的一段功能代码。
     
    触发器的元素:
    事件,执行代码。
     
    创建触发器:
    Create trigger 名字 事件 执行性代码
     
    事件:
    插入 insert
    删除 delete
    修改 update
     
    事件的时机,执行之前和执行之后。Afterbefore
    由以上的时机和事件在一起集成了六种事件。
    Before insertbefore deletebefore update
    After insertafter deleteafter update
     
    一个完整的事件,应该规定,在哪张表上的什么时机的什么动作上,
     
    可执行代码:
    Sql语句所组成的代码
     
    创建触发器:
    Create trigger jiaobanfei after update on czbk_student(表名)
    for each row
    update class(表名) set cz_money=cz_money+20
    解释元素:
    事件:after update on czbk_student(表名)
    可执行性代码:update class(表名) set cz_money=cz_money+20
     
    触发:触发程序
    Update czbk_student set stu_money=stu_money-20 where id=1;
     
    注意:
    1.触发器不能同名
    2.目前MySQL只支持一类事件设置一个触发器。
     
     
     
     
    管理触发器:
    删除:
    Drop trigger 触发器名
    查看:
    Show create trigger 触发器名
     
     
    触发器的内容不能定死,在触发期内,获得触发该触发程序时的数据
    利用触发程序内的newold来完成。
     
    Old
    表示监听事件所在表上的数据,在事件发生之前的数据,称之为旧的数据。
    New
    表示监听事件所在表上的数据,在事件发生之后的数据,称之为新的数据。
     
    数据,触发该事件的记录。
     
    例:
    Create trigger jiaobanfei after update on czbk_student(表名)
    for each row
    update class(表名) set cz_money=cz_money+old.stu_money – new.stu_money
     
    触发:
    Update czbk_student set stu_money=stu_money-500(现在这里随便你写了) where id=1;
     
     
    一个问题,想想,如果当前事件发生在insert动作上,或者是delete动作上
    答:事件发生在insert动作上,不能使用old
    事件发生在delete动作上,不能使用new.
     
    例:
    正确:
    Create trigger ruxue after insert on czbk_student
    For each row
    Update class set stu_count = stu_count+1
    ;
    正确:
    Create trigger ruxue after insert on czbk_student
    For each row
    Update class set stu_count = stu_count+new.id
    ;
     
    报错:
    Create trigger ruxue after insert on czbk_student
    For each row
    Update class set stu_count = stu_count+old.id
    ;
    Delete同理,有old没有new
     
     
     
     
    如果一个触发程序,由多条sql语句组成。
    应该:
    1.将语句组成语句块,[begin  end]用来标识语句块
    2.语句块内的语句需要独立的语句结束符,分号。
     
     
    命令行,由于触发器程序内使用了分号作为语句结束符。
    那么当命令行客户端碰到分号时,就应该理解成触发程序内的子语句结束,
    而不是整个创建触发器的语句结束。
    应该通过修改命令行的语句结束符达到目的。
    Delimiter达到目的
     
     
    例:
    Delimiter $$(设置以$$作为结束符)
    Create trigger ruxue after insert on czbk_student
    For each row
    begin
    Update class set stu_count = stu_count+1;
    Update class set cz_money= cz_money+20;
    end
    $$
     
    Delimiter ;(结束后还是还原回来分号作为结束符)
     
    再触发一下试验下:
    Insert into czbk_student values (2,1980);
  • 相关阅读:
    字符串 查询
    字符串 截取
    字符串 比较
    字符串 拼接
    数组中 的数字排序
    ios中通过ALAssetsLibrary获取所有图片
    IOS中MapKit框架使用地图的显示
    IOS中CoreLocation框架地理定位
    IOS各种动画
    iOS开发--音频播放、录音、视频播放、拍照、视频录制
  • 原文地址:https://www.cnblogs.com/steven9898/p/11340592.html
Copyright © 2020-2023  润新知