搜尋
首頁資料庫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

toadduserInmysqleffect和securly,跟隨台詞:1)USEtheCreateUserStattoDaneWuser,指定thehostandastrongpassword.2)GrantNecterAryAryaryPrivilegesSustherthing privilegesgeStatement,usifementStatement,adheringtotheprinciplelastprefilegege.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)考慮pperformance impactsandSandStorLageBlobSextern; 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)forCompresseBlysBlobs,useuncompresseblobs,useuncompressbeforeconversion.3)expperformance impperformance imptactSandDataEcoding.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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境