博客
关于我
MYSQL:基础——触发器
阅读量:790 次
发布时间:2023-02-11

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

MYSQL基础——触发器

引入触发器

在数据库设计中,某些操作需要在特定事件发生时自动执行。例如,当用户订购产品时,从库存中减去订购数量;或者删除数据时,自动将其备份到存档表。这种自动执行的功能可以通过触发器实现。

触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句或一组语句,前提是触发器关联到特定表。支持触发器的操作包括:

  • DELETE
  • INSERT
  • UPDATE

其他语句如SELECT、CREATE等不支持触发器。


创建触发器

触发器可以通过 CREATE TRIGGER 语句创建。伪代码示例如下:

CREATE TRIGGER newType AFTER INSERT ON ms_articletype FOR EACH ROW SELECT 'Product Added';

创建触发器需要提供以下信息:

  • 触发器名称:例如 newType
  • 关联的表:例如 ms_articletype
  • 支持的操作:例如 DELETEINSERTUPDATE
  • 触发时机:例如 AFTER INSERTBEFORE UPDATE

  • 删除触发器

    触发器不支持直接更新或覆盖,因此要修改触发器必须先删除它,再重新创建。删除触发器的语法如下:

    DROP TRIGGER newType;

    使用触发器

    INSERT触发器

    INSERT 语句执行前或后,触发器会自动执行。以下是使用 INSERT 触发器时需注意的事项:

  • 虚拟表的引用:在触发器代码中,可以引用名为 NEW 的虚拟表访问被插入的行。
  • 更新被插入值:在 BEFORE INSERT 触发器中,可以通过 NEW 修改被插入的数据。
  • 自增字段处理NEWINSERT 执行前包含 0,执行后包含新生成的自增值。
  • 示例

    在插入新类型时,触发器会自动记录日志。

    CREATE TRIGGER logTypeInsert AFTER INSERT ON ms_articletype FOR EACH ROW INSERT INTO log_table (type, datetime) VALUES (NEW.type, CURRENT_TIMESTAMP);

    DELETE触发器

    DELETE 语句执行时,触发器会自动执行。以下是使用 DELETE 触发器时需注意的事项:

  • 虚拟表的引用:在触发器代码中,可以引用名为 OLD 的虚拟表访问被删除的行。
  • 只读访问OLD 表中的数据不可修改,只能读取。
  • 示例

    当删除订单时,触发器会更新相关销售记录。

    CREATE TRIGGER updateSales DELETE ON ms_order FOR EACH ROW UPDATE ms_sale SET total = total + (OLD.amount - NEW.amount) WHERE order_id = OLD.order_id;

    UPDATE触发器

    UPDATE 语句执行时,触发器会自动执行。以下是使用 UPDATE 触发器时需注意的事项:

  • 虚拟表的引用:在触发器代码中,可以同时引用 OLDNEW 虚拟表。
  • 只读访问OLD 表中的值不可修改。
  • 更新操作:在 BEFORE UPDATE 触发器中,可以修改 NEW 中的值,影响 UPDATE 语句的执行结果。
  • 示例

    当更新商品库存时,触发器会更新相关订单的数量。

    CREATE TRIGGER updateInventory BEFORE UPDATE ON ms_goods FOR EACH ROW IF NEW.stock < OLD.stock THEN UPDATE ms_order SET stock = stock + (OLD.stock - NEW.stock) WHERE product_id = OLD.product_id;

    退货实例

    以下是一个实际应用场景的触发器示例:

    CREATE TRIGGER updateGoods AFTER UPDATE ON ms_sale FOR EACH ROW UPDATE ms_order SET or_number = or_number + (OLD.sale_number - NEW.sale_number) WHERE or_id = OLD.sale_or_id;

    当销售订单数量被更新时,触发器会根据差异自动更新相关订单的数量。

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

    你可能感兴趣的文章
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>