在triggers元件中,可以使用一般的SQL叙述完成需要执行的工作,也可以使用在stored routines中讨论过的变数与流程控制,让triggers元件可以处理比较复杂的需求。MySQL资料库在triggers元件中额外提供「OLD」与「NEW」两个关键字:
因为「OLD」与「NEW」两个关键字的特性,所以它们可以使用的triggers种类会有一些限制:
Trigger种类 | OLD | NEW |
INSERT | 不能使用 | 新增的栏位资料 |
UPDATE | 修改前的栏位资料 | 修改后的栏位资料 |
DELETE | 删除前的栏位资料 | 不能使用 |
以「cmdev.emp」表格的「UPDATE TRIGGER」来说,下列是使用「OLD」与「NEW」关键字取得的栏位值:
延续上列为更新「cmdev.emp」表格执行纪录工作的trigger来说,如果想要让纪录的讯息更加详细,包含修改前与修改后的部门编号:
要完成上列的需求,就必须使用「OLD」与「NEW」关键字取得的栏位值:
为表格建立「UPDATE TRIGGER」以后,就表示执行这个表格的修改动作,都会执行这个trigger元件:
如果要将「emp_before_update」的需求,修改为「只有在修改员工的部门编号时,才需要新增修改纪录」,你就可以使用在sotred routines讨论过的「IF」指令来完成这个需求:
在「INSERT TRIGGER」中使用「NEW」关键字时,要特别注意「AUTO_INCREMENT」栏位型态:
如果有需要的话,你也可以使用「SET」叙述设定「NEW」关键字指定的栏位值。以下列的情况来说:
要解决上列的问题,你可以要求在新增资料的时候,不要使用小写的文字。不过使用下列的「BEFORE INSERT TRIGGER」来处理的话,会更方便一些:
建立好这个「BEFORE INSERT TRIGGER」以后,就算新增的员工资料包含小写的名称与职务,这个trigger元件都会在新增纪录之前,把它们转换为大写: