国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

MySQL數(shù)據(jù)庫(kù)中觸發(fā)器應(yīng)用深入研究

2024-07-25 19:09:42
字體:
供稿:網(wǎng)友

在SQL中,名詞觸發(fā)器指“在數(shù)據(jù)庫(kù)中為響應(yīng)一個(gè)特殊表格中的某些事件而自動(dòng)執(zhí)行的程序代碼?!?Wikipedia)說得簡(jiǎn)單一些,它是在一個(gè)特殊的數(shù)據(jù)庫(kù)事件,如INSERT或DELETE發(fā)生時(shí),自動(dòng)激活的一段代碼。觸發(fā)器可方便地用于日志記錄、對(duì)單個(gè)表格到其他鏈接式表格進(jìn)行自動(dòng)的“層疊式”更改、或保證對(duì)表格關(guān)系進(jìn)行自動(dòng)更新。當(dāng)一個(gè)新整數(shù)值增加到數(shù)據(jù)庫(kù)域中時(shí),自動(dòng)更新運(yùn)行的總數(shù)的代碼段是一個(gè)觸發(fā)器。自動(dòng)記錄對(duì)一個(gè)特殊數(shù)據(jù)庫(kù)表格所作更改的SQL命令塊也是一個(gè)觸發(fā)器實(shí)例。

觸發(fā)器是MySQL 5.x的新功能,隨著5.x代碼樹新版本的出現(xiàn),這一功能也逐漸得到改善。在本文中,我將簡(jiǎn)單介紹如何定義并使用觸發(fā)器,查看觸發(fā)器狀態(tài),并如何在使用完畢后刪除觸發(fā)器。我還將為你展示一個(gè)觸發(fā)器在現(xiàn)實(shí)世界中的應(yīng)用實(shí)例,并檢驗(yàn)它對(duì)數(shù)據(jù)庫(kù)記錄的改變。

一個(gè)簡(jiǎn)單實(shí)例

通過簡(jiǎn)單(雖然是人為的)實(shí)例來說明是了解MySQL觸發(fā)器應(yīng)用的最佳辦法。首先我們建立兩個(gè)單域的表格。一個(gè)表格中為姓名列表(表格名:data),另一個(gè)表格中是所插入字符的字符數(shù)(表格名:chars)。我希望在data表格中定義一個(gè)觸發(fā)器,每次在其中插入一個(gè)新姓名時(shí),chars表格中運(yùn)行的總數(shù)就會(huì)根據(jù)新插入記錄的字符數(shù)目進(jìn)行自動(dòng)更新。(見列表A)

mysql> CREATE TABLE data (name VARCHAR(255));Query OK, 0 rows affected (0.09 sec)mysql> CREATE TABLE chars (count INT(10));Query OK, 0 rows affected (0.07 sec)mysql> INSERT INTO chars (count) VALUES (0);Query OK, 1 row affected (0.00 sec)mysql> CREATE TRIGGER t1 AFTER INSERT ONdata FOR EACH ROW UPDATE chars SET count = count + CHAR_LENGTH(NEW.name);Query OK, 0 rows affected (0.01 sec)

列表A

理解上面代碼的關(guān)鍵在于CREATE TRIGGER命令,它被用來定義一個(gè)新觸發(fā)器。這個(gè)命令建立一個(gè)新觸發(fā)器,假定的名稱為t1,每次有一個(gè)新記錄插入到data表格中時(shí),t1就被激活。

在這個(gè)觸發(fā)器中有兩個(gè)重要的子句:

AFTER INSERT子句表明觸發(fā)器在新記錄插入data表格后激活。

UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示觸發(fā)器激活后執(zhí)行的SQL命令。在本例中,該命令表明用新插入的data.name域的字符數(shù)來更新chars.count欄。這一信息可通過內(nèi)置的MySQL函數(shù)CHAR_LENGTH()獲得。

放在源表格域名前面的NEW關(guān)鍵字也值得注意。這個(gè)關(guān)鍵字表明觸發(fā)器應(yīng)考慮域的new值(也就是說,剛被插入到域中的值)。MySQL還支持相應(yīng)的OLD前綴,可用它來指域以前的值。

你可以通過調(diào)用SHOW TRIGGER命令來檢查觸發(fā)器是否被激活,如列表B所示。

mysql> SHOW TRIGGERSG*************************** 1. row ******************?Trigger: t1?Event: INSERT?Table: dataStatement: UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)Timing: AFTER?Created: NULLql_mode:1 row in set (0.01 sec)

列表B

激活觸發(fā)器后,開始對(duì)它進(jìn)行測(cè)試。試著在data表格中插入幾個(gè)記錄:

mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane');Query OK, 2 rows affected (0.00 sec)Records: 2?Duplicates: 0?Warnings: 0

然后檢查chars表格看觸發(fā)器是否完成它該完成的任務(wù):

mysql> SELECT * FROM chars;+-------+| count |+-------+| 7|+-------+1 row in set (0.00 sec)

如你所見,data表格中的INSERT命令激活觸發(fā)器,它計(jì)算插入記錄的字符數(shù),并將結(jié)果存儲(chǔ)在chars表格中。如果你往data表格中增加另外的記錄,chars.count值也會(huì)相應(yīng)增加。

觸發(fā)器應(yīng)用完畢后,可有DROP TRIGGER命令輕松刪除它。

mysql> DROP TRIGGER t1;Query OK, 0 rows affected (0.00 sec)

注意:理想情況下,你還需要一個(gè)倒轉(zhuǎn)觸發(fā)器,每當(dāng)一個(gè)記錄從源表格中刪除時(shí),它從字符總數(shù)中減去記錄的字符數(shù)。這很容易做到,你可以把它當(dāng)作練習(xí)來完成。提示:應(yīng)用BEFORE DELETE ON子句是其中一種方法。

現(xiàn)在,我想建立一個(gè)審計(jì)記錄來追蹤對(duì)這個(gè)表格所做的改變。這個(gè)記錄將反映表格的每項(xiàng)改變,并向用戶說明由誰做出改變以及改變的時(shí)間。我需要建立一個(gè)新表格來存儲(chǔ)這一信息(表格名:audit),如下所示。(列表C)

mysql> CREATE TABLE audit (id INT(7), balance FLOAT, user VARCHAR(50)NOT NULL, time TIMESTAMP NOT NULL);Query OK, 0 rows affected (0.09 sec)

列表C

接下來,我將在accounts表格中定義一個(gè)觸發(fā)器。(列表D)

mysql> CREATE TRIGGER t1 AFTER UPDATEON accountsFOR EACH ROW INSERT INTO audit (id, balance, user, time)VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW());Query OK, 0 rows affected (0.04 sec)

列表D

如果你已經(jīng)走到這一步,就很容易理解。accounts表格每經(jīng)歷一次UPDATE,觸發(fā)器插入(INSERT)對(duì)應(yīng)記錄的id、新的余額、當(dāng)前時(shí)間和登錄audit表格的用戶的名稱。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天水市| 昌乐县| 六安市| 澳门| 乐山市| 乌拉特前旗| 鹤庆县| 长春市| 万盛区| 江华| 中西区| 张北县| 门源| 靖安县| 金湖县| 陵川县| 积石山| 江陵县| 盘锦市| 社旗县| 本溪市| 丹阳市| 会理县| 钦州市| 乐都县| 定南县| 大邑县| 东明县| 乐山市| 夏邑县| 北安市| 双城市| 永安市| 定远县| 安平县| 亚东县| 正镶白旗| 信宜市| 武功县| 宁安市| 遂川县|