触发器

作者: 伍陆柒_ | 来源:发表于2018-11-15 21:52 被阅读0次

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

    创建触发器

    在MySQL中,创建触发器语法如下:

    CREATE TRIGGER [标识触发器名称,用户自行指定]
    [标识触发时机,取值为 BEFORE 或 AFTER]
    [标识触发事件,取值为 INSERT、UPDATE 或 DELETE] ON [表名]
    FOR EACH ROW
    [触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句]
    

    由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

    注意:有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器

    BEGIN … END 详解

    语法如下:

    BEGIN
    [statement_list]
    END
    

    statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾
    而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。

    这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:
    DELIMITER new_delemiter
    new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如 $ :
    DELIMITER $
    在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了$,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。

    实战案例

    班级表 class(班级号 classID, 班内学生数 stuCount)
    学生表 student(学号 stuID, 所属班级号 classID)

    -- 班级表
    CREATE table class(
    classId int(5) PRIMARY KEY not NULL auto_increment,
    stuCount int(8)
    )
    -- 插入3条数据,表示3个班级都为0人
    insert into class(stuCount) values(0),(0),(0)
    -- 创建学员表
    CREATE TABLE student(
    stuId int(5) PRIMARY KEY not NULL auto_increment,
    classId int(5)
    )
    -- 创建触发器
    DELIMITER $
    create trigger tri_stuInsert after insert
    on student for each row
    begin
    declare c int;
    set c = (select stuCount from class where classID=new.classID);
    update class set stuCount = c + 1 where classID = new.classID;
    end $
    DELIMITER 
    -- 向学员表中插入4条数据,表示1班2人,2班1人,3班一人
    insert into student(classId) values(1),(2),(1),(3)
    -- 查询班级表,可以看到班级表中人数随之变化
    select * from class
    
    image.png

    相关文章

      网友评论

          本文标题:触发器

          本文链接:https://www.haomeiwen.com/subject/aouufqtx.html