首页 数据库 mysql教程 MySQL触发器的正确使用与案例分析

MySQL触发器的正确使用与案例分析

Jun 07, 2016 pm 04:13 PM
mysql 使用 文章 案例分析 正确 触发器

以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴。 触发器案例 mysql select*froma;+------+------+------+ |id|name|age|+---

以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴。

触发器案例

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> select * from a; +------+------+------+ <br>| id | name | age | +------+------+------+ <br>| 1 | A1 | 10 | | 2 | A2 | 20 | +------+------+------+ <br>mysql</span><span class="tag">></span><span> select * from b; +------+------+------+ <br>| rid | id | age | +------+------+------+ | 5 | 2 | 20 | +------+------+------+  </span></span></li></ol>
登录后复制

希望在表a的age字段更新的时候能够触发表b相应的age字段也更新:

如:

<ol class="dp-xml"><li class="alt"><span><span>update a set </span><span class="attribute">age</span><span class="attribute-value">age</span><span>=age+1 where </span><span class="attribute">id</span><span>=</span><span class="attribute-value">2</span><span>;  </span></span></li></ol>
登录后复制

相关的表变为:

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> select * from a; +------+------+------+ <br>| id | name | age | +------+------+------+ <br>| 1 | A1 | 10 | | 2 | A2 | 21 | +------+------+------+ <br>mysql</span><span class="tag">></span><span> select * from b; +------+------+------+ <br>| rid | id | age | +------+------+------+ | 5 | 2 | 21 | +------+------+------+ </span></span></li></ol>
登录后复制

正确的写法

触发器代码

<ol class="dp-xml"><li class="alt"><span><span>CREATE TRIGGER bbs1 AFTER UPDATE ON a FOR EACH ROW update b set </span><span class="attribute">age</span><span>=</span><span class="attribute-value">NEW</span><span>.age where </span><span class="attribute">id</span><span>=</span><span class="attribute-value">NEW</span><span>.id;  </span></span></li></ol>
登录后复制

MySQL触发器

触发器的概念:“在数据库中为响应一个特殊表格中的某些事件而自动执行的程序代码。”(Wikipedia)说得简单一些,它是在一个特殊的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的“层叠式”更改、或保证对表格关系进行自动更新。

当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是一个触发器。自动记录对一个特殊数据库表格所作更改的SQL命令块也是一个触发器实例。

触发器是MySQL 5.x的新功能,随着5.x代码树新版本的出现,这一功能也逐渐得到改善。在本文中,我将简单介绍如何定义并使用触发器,查看触发器状态,并如何在使用完毕后删除触发器。我还将为你展示一个触发器在现实世界中的应用实例,并检验它对数据库记录的改变。

例子

通过简单(虽然是人为的)实例来说明是了解MySQL触发器应用的最佳办法。首先我们建立两个单域的表格。一个表格中为姓名列表(表格名:data),另一个表格中是所插入字符的字符数(表格名:chars)。我希望在data表格中定义一个触发器,每次在其中插入一个新姓名时,chars表格中运行的总数就会根据新插入记录的字符数目进行自动更新。

<ol class="dp-xml"><li class="alt">
<span><span>mysql</span><span class="tag">></span><span> CREATE TABLE data (name VARCHAR(255)); <br>Query OK, 0 rows affected (0.09 sec) mysql</span><span class="tag">></span><span> CREATE TABLE chars (count INT(10)); <br>Query OK, 0 rows affected (0.07 sec) mysql</span><span class="tag">></span><span> INSERT INTO chars (count) VALUES (0); <br>Query OK, 1 row affected (0.00 sec) mysql</span><span class="tag">></span><span> CREATE TRIGGER t1 <br>AFTER INSERT ON data FOR EACH ROW UPDATE chars SET </span><span class="attribute">count</span><span class="attribute-value">count</span><span> = count + CHAR_LENGTH(NEW.name); Query OK, 0 rows affected (0.01 sec)  </span></span><br> </li></ol>
登录后复制

理解上面代码的关键在于CREATE TRIGGER命令,它被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。

在这个触发器中有两个重要的子句:

AFTER INSERT子句表明触发器在新记录插入data表格后激活。

UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的data.name域的字符数来更新 chars.count栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。

放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚被插入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。

你可以通过调用SHOW TRIGGER命令来检查触发器是否被激活。

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> SHOW TRIGGERS; *************************** <br>1. row *************************** <br>?Trigger: t1 ?Event: INSERT ?Table: data Statement: <br>UPDATE chars SET </span><span class="attribute">count</span><span class="attribute-value">count</span><span> = count + CHAR_LENGTH(NEW.name) <br>Timing: AFTER ?Created: NULL ql_mode: 1 row in set (0.01 sec)  </span></span></li></ol>
登录后复制

激活触发器后,开始对它进行测试。试着在data表格中插入几个记录:

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> INSERT INTO data (name) VALUES ('Sue'), ('Jane'); <br>Query OK, 2 rows affected (0.00 sec) Records: 2?Duplicates: 0?Warnings: 0 </span></span></li></ol>
登录后复制

然后检查chars表格看MySQL触发器是否完成它该完成的任务:

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> SELECT * FROM chars; +-------+ <br>| count | +-------+ | 7| +-------+ 1 row in set (0.00 sec) </span></span></li></ol>
登录后复制

如你所见,data表格中的INSERT命令激活触发器,它计算插入记录的字符数,并将结果存储在chars表格中。如果你往data表格中增加另外的记录,chars.count值也会相应增加。

触发器应用完毕后,可有DROP TRIGGER命令轻松删除它。

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> DROP TRIGGER t1; Query OK, 0 rows affected (0.00 sec) </span></span></li></ol>
登录后复制

注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种方法。

自写(已测试)

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> create trigger t2 before delete on <br>data for each row update chars set </span><span class="attribute">count</span><span class="attribute-value">count</span><span>=count-char_length(old.name); <br>Query OK, 0 rows affected (0.03 sec) </span></span></li></ol>
登录后复制

现在,我想建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。我需要建立一个新表格来存储这一信息(表格名:audit),如下所示。(列表C)

列表C

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> CREATE TABLE audit (id INT(7), balance FLOAT, <br>user VARCHAR(50) NOT NULL, time TIMESTAMP NOT NULL); <br>Query OK, 0 rows affected (0.09 sec) <br>mysql</span><span class="tag">></span><span> create table accounts(id int(7),label VARCHAR(45),balance float); </span></span></li></ol>
登录后复制

接下来,我将在accounts表格中定义一个MySQL触发器。(列表D)

列表D

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> CREATE TRIGGER t3 AFTER UPDATE ON accounts <br>FOR EACH ROW INSERT INTO audit (id, balance, user, time) <br>VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()); <br>Query OK, 0 rows affected (0.04 sec) </span></span></li></ol>
登录后复制

如果你已经走到这一步,就很容易理解。accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。

实现中的例子:用触发器审计记录

既然你了解了触发器的基本原理,让我们来看一个稍稍复杂的例子。我们常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额。(表A)

表A

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> SELECT * FROM accounts; +----+------------+---------+ <br>| id | label| balance | +----+------------+---------+ <br>|1 | Savings #1 |500 | |2 | Current #1 |2000 | |3 | <br>Current #2 |3500 | +----+------------+---------+ 3 rows in set (0.00 sec) </span></span></li></ol>
登录后复制

然后,检查触发器是否被激活:

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> SHOW TRIGGERS ; *************************** <br>1. row *************************** ?Trigger: t1 ?Event: <br>UPDATE ?Table: accounts Statement: INSERT INTO audit (id, balance, user, time) <br>VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()) Timing: AFTER ?Created: NULL Sql_mode: 1 row in set (0.01 sec) </span></span></li></ol>
登录后复制

再来看最后的结果(列表E):

列表E

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> UPDATE accounts SET </span><span class="attribute">balance</span><span> = </span><span class="attribute-value">500</span><span> WHERE </span><span class="attribute">id</span><span> = <br></span><span class="attribute-value">1</span><span>; Query OK, 1 row affected (0.00 sec) Rows matched: <br>1?Changed: 1?Warnings: 0 mysql</span><span class="tag">></span><span> UPDATE accounts SET <br></span><span class="attribute">balance</span><span> = </span><span class="attribute-value">900</span><span> WHERE </span><span class="attribute">id</span><span> = </span><span class="attribute-value">3</span><span>; Query OK, 1 row affected <br>(0.01 sec) Rows matched: 1?Changed: 1?Warnings: 0 mysql</span><span class="tag">></span><span> <br>UPDATE accounts SET </span><span class="attribute">balance</span><span> = </span><span class="attribute-value">1900</span><span> WHERE </span><span class="attribute">id</span><span> = </span><span class="attribute-value">1</span><span>; Query OK, <br>1 row affected (0.00 sec) Rows matched: 1?Changed: 1?Warnings: 0  </span></span></li></ol>
登录后复制

注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题,我们可以方便地从中进行恢复。

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag">></span><span> SELECT * FROM audit; +------+---------+----------------+---------------------+ <br>| id| balance | user| time| +------+---------+----------------+---------------------+ <br>|1 |500 | root@localhost | 2006-04-22 12:52:15 | |3 |900 | root@localhost | 2006-04-22 12:53:15 <br>| |1 |1900 | root@localhost | 2006-04-22 12:53:23 | +------+---------+----------------+---------------------+ 3 rows in set (0.00 sec)  </span></span></li></ol>
登录后复制

如上面的例子所示,MySQL触发器是一个强大的新功能,它大大增强了RDBMS的自动化程度。自己去试验,练习吧!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mysql用户和数据库的关系 mysql用户和数据库的关系 Apr 08, 2025 pm 07:15 PM

MySQL 数据库中,用户和数据库的关系通过权限和表定义。用户拥有用户名和密码,用于访问数据库。权限通过 GRANT 命令授予,而表由 CREATE TABLE 命令创建。要建立用户和数据库之间的关系,需创建数据库、创建用户,然后授予权限。

mysql 是否要付费 mysql 是否要付费 Apr 08, 2025 pm 05:36 PM

MySQL 有免费的社区版和收费的企业版。社区版可免费使用和修改,但支持有限,适合稳定性要求不高、技术能力强的应用。企业版提供全面商业支持,适合需要稳定可靠、高性能数据库且愿意为支持买单的应用。选择版本时考虑的因素包括应用关键性、预算和技术技能。没有完美的选项,只有最合适的方案,需根据具体情况谨慎选择。

RDS MySQL 与 Redshift 零 ETL 集成 RDS MySQL 与 Redshift 零 ETL 集成 Apr 08, 2025 pm 07:06 PM

数据集成简化:AmazonRDSMySQL与Redshift的零ETL集成高效的数据集成是数据驱动型组织的核心。传统的ETL(提取、转换、加载)流程复杂且耗时,尤其是在将数据库(例如AmazonRDSMySQL)与数据仓库(例如Redshift)集成时。然而,AWS提供的零ETL集成方案彻底改变了这一现状,为从RDSMySQL到Redshift的数据迁移提供了简化、近乎实时的解决方案。本文将深入探讨RDSMySQL零ETL与Redshift集成,阐述其工作原理以及为数据工程师和开发者带来的优势。

mysql用户名和密码怎么填 mysql用户名和密码怎么填 Apr 08, 2025 pm 07:09 PM

要填写 MySQL 用户名和密码,请:1. 确定用户名和密码;2. 连接到数据库;3. 使用用户名和密码执行查询和命令。

MySQL 中的查询优化对于提高数据库性能至关重要,尤其是在处理大型数据集时 MySQL 中的查询优化对于提高数据库性能至关重要,尤其是在处理大型数据集时 Apr 08, 2025 pm 07:12 PM

1.使用正确的索引索引通过减少扫描的数据量来加速数据检索select*fromemployeeswherelast_name='smith';如果多次查询表的某一列,则为该列创建索引如果您或您的应用根据条件需要来自多个列的数据,则创建复合索引2.避免选择*仅选择那些需要的列,如果您选择所有不需要的列,这只会消耗更多的服务器内存并导致服务器在高负载或频率时间下变慢例如,您的表包含诸如created_at和updated_at以及时间戳之类的列,然后避免选择*,因为它们在正常情况下不需要低效查询se

MySQL:初学者的数据管理易用性 MySQL:初学者的数据管理易用性 Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

mysql怎么查看 mysql怎么查看 Apr 08, 2025 pm 07:21 PM

通过以下命令查看 MySQL 数据库:连接到服务器:mysql -u 用户名 -p 密码运行 SHOW DATABASES; 命令获取所有现有数据库选择数据库:USE 数据库名;查看表:SHOW TABLES;查看表结构:DESCRIBE 表名;查看数据:SELECT * FROM 表名;

忘记数据库密码,能在Navicat中找回吗? 忘记数据库密码,能在Navicat中找回吗? Apr 08, 2025 pm 09:51 PM

Navicat本身不存储数据库密码,只能找回加密后的密码。解决办法:1. 检查密码管理器;2. 检查Navicat的“记住密码”功能;3. 重置数据库密码;4. 联系数据库管理员。

See all articles