搜索
首页数据库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
如何向新的MySQL用户授予权限如何向新的MySQL用户授予权限May 09, 2025 am 12:16 AM

TograntpermissionstonewMySQLusers,followthesesteps:1)AccessMySQLasauserwithsufficientprivileges,2)CreateanewuserwiththeCREATEUSERcommand,3)UsetheGRANTcommandtospecifypermissionslikeSELECT,INSERT,UPDATE,orALLPRIVILEGESonspecificdatabasesortables,and4)

如何在MySQL中添加用户:逐步指南如何在MySQL中添加用户:逐步指南May 09, 2025 am 12:14 AM

toadduserInmysqleffectection andsecrely,theTheSepsps:1)USEtheCreateuserStattoDaneWuser,指定thehostandastrongpassword.2)GrantNectalRevileSaryPrivilegesSustate,usiveleanttatement,AdheringTotheTeprinciplelastPrevilegege.3)

mysql:添加具有复杂权限的新用户mysql:添加具有复杂权限的新用户May 09, 2025 am 12:09 AM

toaddanewuserwithcomplexpermissionsinmysql,loldtheSesteps:1)创建eTheEserWithCreateuser'newuser'newuser'@''localhost'Indedify'pa ssword';。2)GrantreadAccesstoalltablesin'mydatabase'withGrantSelectOnMyDatabase.to'newuser'@'localhost';。3)GrantWriteAccessto'

mysql:字符串数据类型和coltrationsmysql:字符串数据类型和coltrationsMay 09, 2025 am 12:08 AM

MySQL中的字符串数据类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT,排序规则(Collations)决定了字符串的比较和排序方式。1.CHAR适合固定长度字符串,VARCHAR适合可变长度字符串。2.BINARY和VARBINARY用于二进制数据,BLOB和TEXT用于大对象数据。3.排序规则如utf8mb4_unicode_ci忽略大小写,适合用户名;utf8mb4_bin区分大小写,适合需要精确比较的字段。

MySQL:我应该在Varchars上使用什么长度?MySQL:我应该在Varchars上使用什么长度?May 09, 2025 am 12:06 AM

最佳的MySQLVARCHAR列长度选择应基于数据分析、考虑未来增长、评估性能影响及字符集需求。1)分析数据以确定典型长度;2)预留未来扩展空间;3)注意大长度对性能的影响;4)考虑字符集对存储的影响。通过这些步骤,可以优化数据库的效率和扩展性。

mysql blob:有什么限制吗?mysql blob:有什么限制吗?May 08, 2025 am 12:22 AM

mysqlblobshavelimits:tinyblob(255bytes),blob(65,535 bytes),中间布洛布(16,777,215个比例),andlongblob(4,294,967,967,295 bytes).tousebl观察性:1)考虑performance impactsandSandStorelargeblobsextern; 2)管理backbackupsandreplication carecration; 3)usepathsinst

MySQL:自动化用户创建的最佳工具是什么?MySQL:自动化用户创建的最佳工具是什么?May 08, 2025 am 12:22 AM

自动化在MySQL中创建用户的最佳工具和技术包括:1.MySQLWorkbench,适用于小型到中型环境,易于使用但资源消耗大;2.Ansible,适用于多服务器环境,简单但学习曲线陡峭;3.自定义Python脚本,灵活但需确保脚本安全性;4.Puppet和Chef,适用于大规模环境,复杂但可扩展。选择时需考虑规模、学习曲线和集成需求。

mysql:我可以在斑点内搜索吗?mysql:我可以在斑点内搜索吗?May 08, 2025 am 12:20 AM

是的,YouCansearchInIdeAblobInMysqlusingsPecificteChniques.1)转换theblobtoautf-8StringWithConvertFunctionWithConvertFunctionandSearchusiseLike.2)forCompresseBlyblobs,useuncompresseblobs,useuncompressbeforeconversion.3)acpperformance impperformance imperformance imptactsanddataEccoding.4)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具