博客
关于我
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 InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL JOIN原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    mysql replace用法
    查看>>
    Mysql Row_Format 参数讲解
    查看>>
    mysql select as 多个_MySQL 中 根据关键字查询多个字段
    查看>>
    mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
    查看>>