MySQL触发器Trigger加载及目前局限性

 更新时间:2023年05月18日 09:20:50   作者:GreatSQL社区  
这篇文章主要为大家介绍了MySQL触发器Trigger加载以及目前局限性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概念介绍

首先需要知道MySQL中触发器特点,以及表table相关触发器加载方式

  • MySQL中单个trigger仅支持单事件触发即单个触发器不支持类似insert or update等多事件语法操作,如果需要多事件都能被同一个表触发,只能分别建立多个对应trigger。
  • 触发器加载首先需要加载触发器分组列表Trigger_chain,后续再将具体触发器添加到Trigger_chain内。
  • 表table属性内可包含多个触发器分组列表Trigger_chain,Trigger_chain用于加载不同类别的触发器,主要类别有insert、update或delete类型。
  • 触发器分组列表Trigger_chain内m_triggers又可加载多个具体属于该分组的具体触发器。

触发器分组列表Trigger_chain加载过程

1.当打开表table时通过如下函数过程加载触发器分组列表Trigger_chain

函数open_tables->open_and_process_table->handle_table->add_tables_and_routines_for_triggers

2.跟踪add_tables_and_routines_for_triggers函数内参数定义

查看TRG_EVENT_MAX定义

enum enum_trigger_event_type {
TRG_EVENT_INSERT = 0,
TRG_EVENT_UPDATE = 1,
TRG_EVENT_DELETE = 2,
TRG_EVENT_MAX
};

查看TRG_ACTION_MAX定义

enum enum_trigger_action_time_type {
TRG_ACTION_BEFORE = 0,
TRG_ACTION_AFTER = 1,
TRG_ACTION_MAX
};

触发器加载存储方式

查看函数get_triggers内可知触发器加载存储方式是二维数组m_trigger_map内

/// Triggers grouped by event, action_time.
Trigger_chain *m_trigger_map[TRG_EVENT_MAX] [TRG_ACTION_MAX];
  • 综合TRG_EVENT_MAX和TRG_ACTION_MAX以及m_trigger_map可以看出目前MySQL触发器加载设计方式存在一定的弊端,即TRG_EVENT分组只能按insert、update、delete区分,单次触发事件只能触发执行对应分组内的触发器,对于需要扩展单触发器同时支持多事件的方式如:insert or update 、update or delete 等方式将需要较大的改造。

触发器分组列表Trigger_chain添加具体触发器trigger过程

1.打开过的table其触发器通过如下函数过程加载

  • 函数open_tables->open_table_entry_fini->check_n_load

2.具体加载过程

  • 通过函数 check_n_load内调用load_triggers函数从磁盘加载已经建好的触发器t。
  • 然后调用create_trigger_chain函数获取到前期已经加载的触发器分组列表Trigger_chain。
  • 最后触发器分组列表Trigger_chain调用add_trigger添加具体触发器t至分组列表内。
  • 当目标表table有insert、update或delete操作时,即会触发执行对应分组列表Trigger_chain内相应分组的触发器。

说明:MySQL在新增和删除触发器的操作时都会关闭当前已经打开的table句柄,在下次打开table时会重新load相应的trigger。

Enjoy GreatSQL :)

## 关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接:

 GreatSQL社区 

 Gitee

 GitHub

以上就是MySQL触发器Trigger加载及目前局限性的详细内容,更多关于MySQL触发器Trigger的资料请关注脚本之家其它相关文章!

相关文章

  • mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)

    mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.

    这篇文章主要为大家分享了MySQL 5.7以上缩版本安装配置方法图文教程,包括mysql5.7.12、mysql5.7.13、mysql5.7.14安装教程,包括感兴趣的朋友可以参考一下
    2016-08-08
  • win11设置mysql开机自启的实现方法

    win11设置mysql开机自启的实现方法

    本文主要介绍了win11设置mysql开机自启的实现方法,要通过命令行方式设置,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • mysql删除重复行的实现方法

    mysql删除重复行的实现方法

    这篇文章主要介绍了mysql删除重复行的实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • MySQL大表数据的分区与分库分表的实现

    MySQL大表数据的分区与分库分表的实现

    数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • mysql中like % %模糊查询的实现

    mysql中like % %模糊查询的实现

    这篇文章主要介绍了mysql中like % %模糊查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Mysql数据表中的蠕虫复制使用方法

    Mysql数据表中的蠕虫复制使用方法

    在本文中我们给大家分享了关于怎么使用Mysql数据表中的蠕虫复制的相关知识点,有兴趣的朋友们学习下。
    2019-02-02
  • Win下Mysql5.6升级到5.7的方法

    Win下Mysql5.6升级到5.7的方法

    MySQL的升级方式分为两种:原地升级和逻辑升级。这两种升级方式,本质没有什么区别的,下面通过本文给大家详细介绍Win下Mysql5.6升级到5.7的方法,需要的的朋友参考下
    2017-04-04
  • mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句

    mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句

    这篇文章主要介绍了mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句,一般在一些统计报表中比较常用这个时间段,需要的朋友可以参考下
    2014-06-06
  • 数据库中如何通过创建新表来备份操作示例代码

    数据库中如何通过创建新表来备份操作示例代码

    数据库备份是指在特定时间点保存数据库中数据的过程,备份数据通常存储在不同的物理介质上,比如硬盘、磁带或云端存储设备,以防止数据丢失或损坏,这篇文章主要介绍了数据库中如何通过创建新表来备份操作的相关资料,需要的朋友可以参考下
    2025-07-07
  • mysql 基本操作

    mysql 基本操作

    早打算写些关于数据库操作方面的知识了,现在终于完成了第一篇,以下记录了关于mysql操作方面的基础知识
    2012-08-08

最新评论