• 触发器


    定义

    触发器是在数据库中,在执行对资料有异动的动作时,先行拦截并处理的一种数据库对象,它大部分会设在资料表中,作为强制运行特定动作的程序,因此又称为数据库操纵语言(DML)触发器。

    优点

    1. 可在写入资料前,强制检验或转换资料
    2. 触发程序发生错误时,异动的结果会被撤销

    种类

    1. BEFORE:在异动发生前执行
    2. AFTER:在异动发生后运行
    3. INSTEAD OF:替换异动的指令

    语法

    CREATE TRIGGER<>

    {BEFORE | AFTER} <触发事件> ON <表名>

    REFERENCING NEW|OLD ROW AS <变量>

    FOR EACH {ROW | STATEMENT}

    [WHEN <触发条件>]<触发动作体>

    注意:触发器只能定义在基本表上,不能定义在视图上

    触发器类型

    行级触发器(FOR EACH ROW):触发器发生的次数与表的行数有关

    语句级触发器(FOR EACH STATEMENT):触发动作只发生一次

    举个例子

    当对表SC的Grade属性进行修改时,若分数增加了10%则将此次操作记录到下面表中:
    SC_U(Sno,Cno,Oldgrade,Newgrade)
    其中Oldgrade是修改前的分数,Newgrade是修改后的分数。
    CREATE TRIGGER SC_T
    AFTER UPDATE OF Grade ON SC
     REFERENCING
     OLD row AS OldTuple,
     NEW row AS NewTuple
    FOR EACH ROW 
    WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade)
     INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade) 
    VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

    课后习题

    1.建设之前创建的course表没有定义外键级联策略,创建触发器,实现在course表中删除课程信息时,可自动删除该课程在SC表上的成绩信息。

    思路:

    通过上面关于触发器的基础知识的了解,我们很容易写出这道问题的代码的基本框架

    CREATE TRIGGER deleteScore
    AFTER DELETE ON course
    FOR EACH ROW
    BEGIN
        ......
    END

    这里我们首先使用的是行级触发器,因为这道问题比较简单,所以就没有写触发动条件,触发动作体在触发器激活后立即执行。现在我们要解决的是应该怎么来实现触发动作体,因为我们使用的是行级触发器,可以在过程体中使用NEW和OLD引用事件之后的新值和事件之前的旧值。在不同的触发器中NEW和OLD的含义各不相同

    mysql触发器中, NEW关键字,和 MS SQL Server 中的 INSERTED 和 DELETED 类似,MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。

    具体地:
    在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
    在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
    在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
    使用方法: NEW.columnName (columnName 为相应数据表某一列名)
    另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用。
    ————————————————
    版权声明:本文为CSDN博主「问就是啥也不是」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/bcfdsagbfcisbg/article/details/78338434

     SQL:

    CREATE TRIGGER deleteScore
    AFTER DELETE ON course
    FOR EACH ROW
    BEGIN
        DELETE FROM score WHERE c_id = OLD.c_id;
    END

    执行前s_score表:

     执行前course表:

    执行后

     执行后score表:

     从最后的结果中我们可以看出,再删除语句中我们并没有删除score表中的内容,但是因为我们设置了一个触发器,当我们要删除course表中的课程时,score表中与该课程有关的元组也会被删除。

    当然,除了使用这种方法来进行级联删除之外,我们还可以使用外键的方式来进行删除。

    2. 创建触发器,实现当删除student表的某个学生信息时,把该学生的学号和姓名添加到de_student表中。

    CREATE TABLE IF NOT EXISTS de_student(
        s_id CHAR(20) PRIMARY KEY,
        s_name CHAR(20) NOT NULL
    );
    
    CREATE TRIGGER add_info
    AFTER DELETE ON student
    FOR EACH ROW
    BEGIN
        INSERT INTO de_student VALUES (OLD.s_id, OLD.s_name);
    END
        

    3. 创建触发器,实现当course表中某门课程的课程号被更改时,同时将SC表上的课程号全部更新。

    CREATE TRIGGER update_score_c_id
    AFTER UPDATE ON course
    FOR EACH ROW
    BEGIN
        UPDATE score
        SET c_id = NEW.c_id
        WHERE c_id = OLD.c_id;
    END

    4. 创建触发器,实现当删除student表的某个人信息时,可自动删SC表上相应的成绩记录。

    CREATE TRIGGER deleteStudent
    AFTER DELETE ON student
    FOR EACH ROW
    BEGIN
        DELETE FROM score WHERE s_id = OLD.s_id;
    END
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    dnsServer SmartDNS / smartdns / DNS UDP 53
    springBoot 自定义注解 + 自定义异常捕获实战
    查询出ES库所有数据
    springBoot2.X 支持http、https访问
    配置ES IK分词器自定义字典
    搭建angular开发环境 运行 ng-alain框架
    【jQuery】 选择器
    【jQuery】 js 对象
    【C#】 URL Protocol
    【C#】 反射
  • 原文地址:https://www.cnblogs.com/h-hkai/p/14912388.html
Copyright © 2020-2023  润新知