妙用触发器有效管理MySQL数据库

2008-02-23 07:37:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  在SQL中,名词触发器指“在数据库中为响应一个特别表格中的某些事件而自动执行的程式代码。”(Wikipedia)说得简单一些,他是在一个特别的数据库事件,如INSERT或DELETE发生时,自动激活的一段代码。触发器可方便地用于日志记录、对单个表格到其他链接式表格进行自动的“层叠式”更改、或确保对表格关系进行自动更新。当一个新整数值增加到数据库域中时,自动更新运行的总数的代码段是个触发器。自动记录对一个特别数据库表格所作更改的SQL命令块也是个触发器实例。

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

  一个简单实例

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

  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 ON
  data FOR EACH ROW UPDATE chars SET count = count CHAR_LENGTH(NEW.name);
  Query OK, 0 rows affected (0.01 sec)

  理解上面代码的关键在于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\G
  *************************** 1. row ***************************
  ?Trigger: t1
  ?Event: INSERT
  ?Table: data
  Statement: UPDATE chars SET count = 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> 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子句是其中一种方法。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 实例讲解:.NET如何访问MySQL数据库

下一篇: 最好措施 全面解决MySQL网络安全问题