暂无 |

4 OLD与NEW关键字

在triggers元件中,可以使用一般的SQL叙述完成需要执行的工作,也可以使用在stored routines中讨论过的变数与流程控制,让triggers元件可以处理比较复杂的需求。MySQL资料库在triggers元件中额外提供「OLD」与「NEW」两个关键字:

mysql_16_snap_13

因为「OLD」与「NEW」两个关键字的特性,所以它们可以使用的triggers种类会有一些限制:

Trigger种类 OLD NEW
INSERT 不能使用 新增的栏位资料
UPDATE 修改前的栏位资料 修改后的栏位资料
DELETE 删除前的栏位资料 不能使用

以「cmdev.emp」表格的「UPDATE TRIGGER」来说,下列是使用「OLD」与「NEW」关键字取得的栏位值:

mysql_16_snap_14

延续上列为更新「cmdev.emp」表格执行纪录工作的trigger来说,如果想要让纪录的讯息更加详细,包含修改前与修改后的部门编号:

mysql_16_snap_15

要完成上列的需求,就必须使用「OLD」与「NEW」关键字取得的栏位值:

mysql_16_snap_16

为表格建立「UPDATE TRIGGER」以后,就表示执行这个表格的修改动作,都会执行这个trigger元件:

mysql_16_snap_17

如果要将「emp_before_update」的需求,修改为「只有在修改员工的部门编号时,才需要新增修改纪录」,你就可以使用在sotred routines讨论过的「IF」指令来完成这个需求:

mysql_16_snap_18

在「INSERT TRIGGER」中使用「NEW」关键字时,要特别注意「AUTO_INCREMENT」栏位型态:

mysql_16_snap_19

如果有需要的话,你也可以使用「SET」叙述设定「NEW」关键字指定的栏位值。以下列的情况来说:

mysql_16_snap_20

要解决上列的问题,你可以要求在新增资料的时候,不要使用小写的文字。不过使用下列的「BEFORE INSERT TRIGGER」来处理的话,会更方便一些:

mysql_16_snap_21

建立好这个「BEFORE INSERT TRIGGER」以后,就算新增的员工资料包含小写的名称与职务,这个trigger元件都会在新增纪录之前,把它们转换为大写:

mysql_16_snap_22

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

发表评论

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