MySQL触发器--12.1创建触发器

内容来自《MySQL从入门到精通》清华大学出版社一书的内容,随看书随打打笔记,会不断补充 

触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MySQL自动调用。比如当对fruits表进行(INSERT,UPDATE,DELETE)时就会激活它执行。

触发器可以查询其它标,而且可以包含复杂的SQL语句。它们主要用于满足负载的业务规则或者要求。例如:可以根据客户当前的账户状态,控制是否允许插入新订单。下面介绍如何创建:

12.1.1创建只有一个执行语句的触发器

语法如下:

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字段值进行求和计算。

代码执行如下:

MySQL触发器--12.1创建触发器_第1张图片

首先创建一个account表,在向表account插入数据之前,计算所有新插入的account表的amount值之和,触发器的名称为ins_sum,条件是在向表插入数据之前触发。

12.1.2创建有多个执行语句的触发器

创建多个执行语句的触发器的语法如下:

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个表中数据如下:

MySQL触发器--12.1创建触发器_第2张图片

MySQL触发器--12.1创建触发器_第3张图片

执行结果显示,向表test1中插入记录的时候,其余三个表都发生改变。INSERT触发了触发器,向test2中插入了test1中的值,删除了test3中的相同内容。同时更新了test4中的b4,即与插入的值相同的个数。

 

 

你可能感兴趣的:(MySQL)