暂无 |

2 建立Triggers

下列是建立trigger元件的语法:

mysql_16_snap_04

如果trigger元件执行的工作比较复杂,需要一个以上的叙述时,就要把叙述放在「BEGIN」与「END」区块中:

mysql_16_snap_05

你可以依照需求为一个表格建立不同的trigger元件:

mysql_16_snap_06

以上列讨论的需求来说,每一次修改「cmdev.emp」表格资料,都必须新增一笔纪录到「cmdev.emplog」表格中。你要为「cmdev.emp」表格建立一个「UPDATE TRIGGER」;而「BEFORE」与「AFTER」就是「之前」与「之后」的意思。如果建立「BEFORE UPDATE TRIGGER」,那就表示在修改资料前会执行trigger;如果建立「AFTER UPDATE TRIGGER」,那就表示在修改资料后会执行trigger。以这个需求来说,「BEFORE」或「AFTER」都是一样的。

建立trigger元件与建立stored routines的方式一样,你也要使用「SQL script」来执行建立trigger的工作。下列的范例建立一个名称为「emp_before_update」的trigger元件:

mysql_16_snap_07

执行上列的叙述后,MySQL资料库会储存你建立的trigger元件,可是它并不像stored routines可以用来呼叫与执行;MySQL资料库会自动帮你执行这些储存在trigger中的叙述。

为「cmdev.emp」表格建立一个「BEFORE UPDATE TRIGGER」以后,只要发生修改「cmdev.emp」表格资料的情况,MySQL资料库会自动执行这个trigger中的叙述:

mysql_16_snap_08

不论是「UPDATE」或是其它两种Trigger元件,MySQL资料库都是以「纪录」来执行trigger。以下列的范例来说,一个会修改三笔纪录的「UPDATE」叙述,MySQL资料库会执行trigger三次:

mysql_16_snap_09

如果在执行修改「cmdev.emp」表格叙述以后,实际上并没有修改任何纪录资料,那MySQL资料库也不会执行trigger:

mysql_16_snap_10

在你建立trigger元件时,要特别注意下列的限制:

  • 同一个资料库不可以有相同名称的Trigger
  • TEMPORARY表格与View不可以建立Trigger
  • 不可以使用「SELECT」叙述
  • 不可以使用「CALL」叙述
  • 不可以使用与交易(transactions)相关的叙述,包含「START TRANSACTION」、「COMMIT」与「ROLLBACK」

0

java教程
php教程
php+mysql教程
ThinkPHP教程
MySQL
C语言
css
javascript
Django教程

发表评论

    评价:
    验证码: 点击我更换图片
    最新评论