当前位置:首页 > 系统运维 > 正文内容

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

a8116255316年前 (2010-05-19)系统运维9

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

触发器案例

mysql> select * from a; +------+------+------+ 

 

理解上面代码的关键在于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命令来检查触发器是否被激活。

mysql> SHOW TRIGGERS; *************************** 

1. row *************************** 

Trigger: t1  Event: INSERT  Table: data statement: 

UPDATE chars SET countcount = count + CHAR_LENGTH(NEW.name) 

Timing: AFTER  Created: NULL ql_mode: 1 row in set (0.01 sec)  

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

mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane'); 

Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 

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

mysql> SELECT * FROM chars; +-------+ 

| count | +-------+ | 7| +-------+ 1 row in set (0.00 sec) 

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

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

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

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

自写(已测试)

mysql> create trigger t2 before delete on 

data for each row update chars set countcount=count-char_length(old.name); 

Query OK, 0 rows affected (0.03 sec) 

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

列表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) 

mysql> create table accounts(id int(7),label VARCHAR(45),balance float); 

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

列表D

mysql> CREATE TRIGGER t3 AFTER UPDATE ON accounts 

FOR 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) 

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

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

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

表A

mysql> SELECT * FROM accounts; +----+------------+---------+ 

| id | label| balance | +----+------------+---------+ 

|1 | Savings #1 |500 | |2 | Current #1 |2000 | |3 | 

Current #2 |3500 | +----+------------+---------+ 3 rows in set (0.00 sec) 

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

mysql> SHOW TRIGGERS ; *************************** 

1. row ***************************  Trigger: t1  Event: 

UPDATE  Table: accounts Statement: INSERT INTO audit (id, balance, user, time) 

VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()) Timing: AFTER  Created: NULL Sql_mode: 1 row in set (0.01 sec) 

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

列表E

balance = 900 WHERE id = 3; Query OK, 1 row affected 

(0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> 

UPDATE accounts SET balance = 1900 WHERE id = 1; Query OK, 

1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0  

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

mysql> SELECT * FROM audit; +------+---------+----------------+---------------------+ 

| id| balance | user| time| +------+---------+----------------+---------------------+ 

|1 |500 | chinastor.com-root@localhost | 2006-04-22 12:52:15 | |3 |900 | chinastor.com-root@localhost | 2006-04-22 12:53:15 

| |1 |1900 | chinastor.com-root@localhost | 2006-04-22 12:53:23 | +------+---------+----------------+---------------------+ 3 rows in set (0.00 sec)  

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

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://www.2345hao.cn/blog/index.php/post/20413.html

分享给朋友:

“MySQL触发器的正确使用与案例分析” 的相关文章

windows 7鼠标停顿怎么办?windows 7 usb鼠标停顿的原因以及解决

windows 7鼠标停顿怎么办?windows 7 usb鼠标停顿的原因以及解决

很多使用Windows 7系统的朋友都想小编反应,假如暂停使用电脑,鼠标会出现停顿现象,这是怎么回事呢 该怎么解决呢 下面就和小编一起去看下Windows 7 usb鼠标停顿的解决方法吧。 由于Windows 7系统中有一项USB选择性暂停造成的。这项设置主要为了节电,当他检测到用户没有对系统进行...

windows 7系统如何设置休眠时不断网以便继续完成下载

windows 7系统如何设置休眠时不断网以便继续完成下载

在Windows 7系统的默认设置中,当Windows 7系统处于休眠状态时,会同时断网的。如此一来,无论你正在使用迅雷还是快车等下载工具,同样可以在休眠状态下继续完成下载,最大限度做到从身边的小事开始支持环保。下面我们就详细介绍操作步骤,帮助Windows 7系统用户实现这一节能目标。 首先需要...

windows 7系统的电脑发出嘟嘟嘟的声音该怎么解决?

windows 7系统的电脑发出嘟嘟嘟的声音该怎么解决?

在某些电脑中,机器内部蜂鸣器与系统的声音输出方案是相关联的,这样一来会导致当系统输出声音时,即使电脑没有连接外部音响或耳机,也会通过内置蜂鸣器发出“嘟嘟哔哔”的声音。这个问题主要出现在Windows 7电脑中,假如你的电脑恰好遇到了这样的问题,可参考下面的方法来解决: 1、在桌面“计算机”图标上右...

windows 7查看电脑近期使用情况确定有没有被他人使用

windows 7查看电脑近期使用情况确定有没有被他人使用

我一个朋友最近装装了Windows 7,他总感觉有人用了他的电脑,但是一直不确定,他想知道有没有人动用他的电脑,问我有没有办法 我说设置一下就行了: 启动Windows 7,在搜索栏中输入编辑组,马上就搜索到了编辑组策略,点击即可启动程序编辑组策略。依次展开组策略左侧树形列表的计算机配置/管理模...

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

故障现象: Windows 7酷狗软件无声音,系统声音正常。 原因分析: 1. 查看酷狗软件设置 2. 查看系统设置 解决方案: 1. Windows 7操作方法 如图:查看是否处于禁音状态   Windows 7系统声音正常酷狗音乐无声音 2. 查看设置音频输出是否...

windows 7如何创建拨号连接

windows 7如何创建拨号连接

一、打开控制面板,选择“网络和共享中心”; 二、在网络和共享中心中选择“设置新的连接或网络”; 三、选择连接到Internet; 四、选择“仍要设置新的连接”; 五、选择“宽带PPPoE ”; 六、输入对应的宽带帐号及密码,点击连接即可;...