内容来自《MySQL从入门到精通》清华大学出版社一书的内容,随看书随打打笔记,会不断补充
触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。比如当对fruits表进行(INSERT,UPDATE,DELETE)时就会激活它执行。
触发器可以查询其它标,而且可以包含复杂的SQL语句。它们主要用于满足负载的业务规则或者要求。例如:可以根据客户当前的账户状态,控制是否允许插入新订单。下面介绍如何创建:
语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tb1_name FOR EACH ROW trigger_stmt
其中trigger_name标识触发器名称,用户自行指定;trigger_time标识触发时机,可以指定为before或after;trigger_event标识触发事件,包括INSERT,UPDATE和DELETE;tb1_name标识建立触发器的表名,即在哪张表上建立触发器;trigger_stmt是触发器执行语句。
例:创建一个单执行语句的触发器
CREATE TABLE account(acct_num INT,amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum=@sum+NEW.amount;
首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型),amount字段(定义成浮点类型);其次创建一个名为ins_sum的触发器,触发的条件是向数据表account插入数据之前,对新插入的amount字段值进行求和计算。
代码执行如下:
首先创建一个account表,在向表account插入数据之前,计算所有新插入的account表的amount值之和,触发器的名称为ins_sum,条件是在向表插入数据之前触发。
创建多个执行语句的触发器的语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tb1_name FOR EACH ROW
BRGIN
语句执行列表
END
触发器程序可以使用BEGIN和END作为开始和结束,中间包含多条语句。
例:创建一个包含多个执行语句的触发器
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
DELIMITER //
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2=NEW.a1; //向a2插入a1的新插入值
DELETE FROM test3 WHERE a3=NEW.a1; //当a3的自增值有与新插入a1的值相同则删除
UPDATE test4 SET b4=b4+1 WHERE a4=NEW.a1; //当a4的自增值等于a1中新插入的值,更新b4则加1.
END
//
DELIMITER;
INSERT INTO test3(a3) VALUES
(NULL),(NULL),(NULL),(NULL),(NULL),
(NULL),(NULL),(NULL),(NULL),(NULL);
INSERT INTO test4(a4) VALUES
(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
INSERT INTO test1 VALUES
(1),(3),(1),(7),(1),(8),(4),(4);
创建了一个名为testref的触发器,触发条件为向test1中插入数据前执行触发器的语句。
4个表中数据如下:
执行结果显示,向表test1中插入记录的时候,其余三个表都发生改变。INSERT触发了触发器,向test2中插入了test1中的值,删除了test3中的相同内容。同时更新了test4中的b4,即与插入的值相同的个数。