博客
关于我
Mysql-触发器及创建触发器失败原因
阅读量:794 次
发布时间:2023-02-11

本文共 1945 字,大约阅读时间需要 6 分钟。

触发器(Trigger)详解

触发器是一种数据库对象,用于在特定数据操作发生时自动执行预定义的操作。它能够帮助确保数据的完整性和一致性,虽然其使用可能带来性能开销,但在特定场景下非常有用。本文将详细介绍触发器的相关知识。

触发器的定义与特性

触发器与数据库表紧密相关,通常与INSERTUPDATEDELETE操作事件相关联。在满足一定条件时,触发器会自动执行预定义的语句集合。以下是触发器的主要特性:

  • 有begin end体:触发器中的操作可以是简单的或复杂的多步骤操作。
  • 触发条件:触发器可以根据INSERTUPDATEDELETE操作类型来触发。
  • 触发时机:触发器在数据操作的执行,具体由BEFOREAFTER参数决定。
  • 触发频率:触发器针对每一行数据执行一次,适用于需要对每条记录处理的场景。
  • 附着性:触发器与表直接关联,无法在临时表或视图上使用。
  • 触发器的主要用途是维护数据的完整性,例如在数据插入前检查格式是否正确,或在数据删除后备份记录。

    创建触发器

    创建触发器的语法和示例如下:

    DELIMITER $$CREATE TRIGGER trig_name [DEFINER = user] TRIGGER timing Event ON table_name FOR EACH ROW [trigger_order] trigger_body$$DELIMITER ;

    关键语法解析

    • DELIMITER $$:改变命令分隔符,避免触发器的语句被误解。
    • CREATE TRIGGER:创建触发器的命令,trig_name为触发器名称。
    • timing:触发时机,BEFOREAFTER
    • Event:触发事件类型,INSERTUPDATEDELETE
    • ON table_name:指定关联的表。
    • FOR EACH ROW:触发器针对每一行数据执行。
    • trigger_order:在MySQL 5.7及以上版本,用于定义触发器执行顺序,FOLLOWSPRECEDES
    • trigger_body:触发器执行的具体语句,BEGINEND之间的内容。

    示例

    只有一个语句的触发器

    DELIMITER $$CREATE TRIGGER tri_upd BEFORE UPDATE ON tag1 FOR EACH ROWBEGIN    IF NEW.name != OLD.name THEN        INSERT INTO tag2 (name) VALUES (NEW.name);    END IF;END$$DELIMITER ;

    多个语句的触发器

    DELIMITER $$CREATE TRIGGER tri_upd BEFORE DELETE ON work FOR EACH ROWBEGIN    INSERT INTO time (time);    INSERT INTO time (time);END$$DELIMITER ;

    NEW与OLD的使用

    在触发器中,NEWOLD用于引用数据变更前后的值:

    • NEW:表示插入或更新后的新值,支持赋值操作且不会触发循环调用。
    • OLD:表示插入或更新前的旧值,只读。

    示例:

    DELIMITER $$CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROWBEGIN    IF NEW.amount < 0 THEN        SET NEW.amount = 0;    ELSE IF NEW.amount > 100 THEN        SET NEW.amount = 100;    END IF;END$$DELIMITER ;

    查看触发器

    使用以下方法查看触发器信息:

  • SHOW TRIGGERS:列出所有触发器的基本信息。

  • information_schema.triggers:获取详细触发器信息,支持按名称查询。

  • 示例:

    SELECT * FROM information_schema.triggers WHERE trigger_name = 'upd_check';

    删除触发器

    删除触发器时,确保已知其名称:

    DROP TRIGGER IF EXISTS [schema_name.]trigger_name;

    注意事项

    • 合理利用:触发器可能对性能有显著影响,尤其是在高并发或大量数据操作场景下。
    • 性能优化:确保触发器中的操作高效,避免过多资源消耗。
    • 谨慎删除:删除不需要的触发器以防误操作。

    通过合理使用触发器,能够有效提升数据库的数据管理能力,但也需权衡其带来的性能开销。

    转载地址:http://ujbfk.baihongyu.com/

    你可能感兴趣的文章
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>
    MySQL 添加索引,删除索引及其用法
    查看>>
    MySQL 用 limit 为什么会影响性能?
    查看>>
    MySQL 用 limit 为什么会影响性能?有什么优化方案?
    查看>>
    MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
    查看>>
    mysql 用户管理和权限设置
    查看>>
    MySQL 的 varchar 水真的太深了!
    查看>>
    mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
    查看>>
    MySQL 的instr函数
    查看>>
    MySQL 的mysql_secure_installation安全脚本执行过程介绍
    查看>>
    MySQL 的Rename Table语句
    查看>>
    MySQL 的全局锁、表锁和行锁
    查看>>
    mysql 的存储引擎介绍
    查看>>