6.6.1 触发器的创建

6.6.1 触发器的创建

触发器必须创建在指定的数据表上,在MySQL中,创建触发器语法如下:

参数说明:

触发器名:标识触发器名称,用户自行指定。

触发时间:标识触发时机,取值为before或after,指明触发程序是在激活它的语句之前或之后触发。

触发事件:取值为insert、update或delete。

①insert型触发器:插入某一行时激活触发器,可能通过insert、load data、replace语句触发;

②update型触发器:更改某一行时激活触发器,可能通过update语句触发;

③delete型触发器:删除某一行时激活触发器,可能通过delete、replace语句触发。

由此可见,MySQL中可建立6种触发器,即before insert、before update、before delete、after insert、after update、after delete。但是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。

数据表名:标识建立触发器的表名,即在哪张表上建立触发器。

触发器程序体:可以是一句SQL语句,或者用begin和end包含的多条语句。

for each row:该子句通知触发器每更新一条数据执行一次动作,而不是对整个表执行一次。

trigger_event详解:

MySQL除了对insert、update、delete基本操作进行定义外,还定义了load data和replace语句,这两种语句也能引起上述6种类型触发器的触发。

load data语句用于将一个文件装入一个数据表中,相当于一系列的insert操作。

replace语句一般来说和insert语句很像,只是在表中有primary key或unique索引时,如果插入的数据和原来primary key或unique索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条replace语句有时候等价于一条insert语句,有时候等价于一条delete语句加上一条insert语句。

new与old详解:

MySQL中定义了new和old关键字,能够访问受触发程序影响的行中的列(old和new不区分大小写)。

①在insert型触发器中,new用来表示将要(before)或已经(after)插入的新数据;

②在update型触发器中,old用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据;

③在delete型触发器中,old用来表示将要或已经被删除的原数据。

使用方法:new.columnName(columnName为相应数据表某一字段名)

old是只读的,而new则可以在触发器中使用set语句赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2017”)。

在insert触发程序中,仅能使用new.columnName,没有旧行。在delete触发程序中,仅能使用old.columnName,没有新行。在update触发程序中,可以使用old.columnName来引用更新前的某一行的列,也能使用new.columnName来引用更新后的行中的列。用old命名的字段是只读的。可以引用它,但不能更改它。对于用new命名的列,如果具有select权限,可引用它。在before触发程序中,如果具有update权限,可使用“set new.columnName=value”更改它的值。这意味着,可以使用触发程序来更改将要插入新行中的值,或用于更新行的值。