博客
关于我
Mysql-触发器及创建触发器失败原因
阅读量:796 次
发布时间: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中having的用法
    查看>>
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>