zoukankan      html  css  js  c++  java
  • 十一、触发器

    触发器:
    监听数据进行操作
    在当前的表上,设置一个对每行数据的一个监听器,监听相关事件
    每当事件发生时,会执行一段由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);
  • 相关阅读:
    内存 : CL设置
    联通积分兑换的Q币怎么兑换到QQ上
    DB2数据库表追加字段
    显示菜单项与按钮项的关联关系
    如何将Windows8系统的磁盘格式(GPT格式)转换成Windows 7系统的磁盘格式(MBR格式)
    索尼(SONY) SVE1512S7C 把WIN8降成WIN7图文教程
    SqlServer之数据库三大范式
    Python并发编程-Redis
    Python并发编程-Memcached (分布式内存对象缓存系统)
    Python并发编程-RabbitMQ消息队列
  • 原文地址:https://www.cnblogs.com/steven9898/p/11340592.html
Copyright © 2011-2022 走看看