博客
关于我
Mysql-触发器及创建触发器失败原因
阅读量:793 次
发布时间: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 Timestamp时间隔了8小时
    查看>>
    Mysql tinyint(1)与tinyint(4)的区别
    查看>>
    MySQL Troubleshoting:Waiting on query cache mutex
    查看>>
    mysql union orderby 无效
    查看>>
    mysql v$session_Oracle 进程查看v$session
    查看>>
    mysql where中如何判断不为空
    查看>>
    mysql where中如何判断不为空
    查看>>
    MySQL Workbench 使用手册:从入门到精通
    查看>>
    MySQL Workbench 数据库建模详解:从设计到实践
    查看>>
    MySQL Workbench 数据建模全解析:从基础到实践
    查看>>
    mysql workbench6.3.5_MySQL Workbench
    查看>>
    MySQL Workbench安装教程以及菜单汉化
    查看>>
    MySQL Xtrabackup 安装、备份、恢复
    查看>>
    mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
    查看>>
    MySQL _ MySQL常用操作
    查看>>
    MySQL – 导出数据成csv
    查看>>
    MySQL —— 在CentOS9下安装MySQL
    查看>>
    MySQL —— 视图
    查看>>
    web项目 log4j2 指定配置文件路径
    查看>>
    mysql 不区分大小写
    查看>>