MySQL 触发器

 

建立触发器javascript

在建立触发器时,须要给出 4条信息:java

        一、惟一的触发器名;
        二、触发器关联的表
        三、触发器应该响应的动做( DELETEINSERT UPDATE
        四、触发器什么时候执行(处理以前或以后)。
 
  注意:只有表才支持触发器,视图不支持(临时表也不支持)。
    触发器按每一个表每一个事件每次地定义,每一个表每一个事件每次只容许一个触发器。所以,每一个表最多支持 6个触发器(每条INSERT、 UPDATEDELETE的以前和以后)。单一触发器不能与多个事件或多个表关联,所以,若是你须要一个对 INSERTUPDATE 操做执行的触发器,则应该定义两个触发器。
  注意:若是BEFORE触发器失败,则 MySQL将不执行请求的操做。此外,若是 BEFORE触发器或语句自己失败, MySQL将不执行 AFTER触发器(若是有的话)。
 
 触发器 能够 使用BEGIN 和END 语句标记触发器体。但不是必需的。使用 BEGIN END 块的好处是触发器能容纳多条语句。

 

INSERT触发器

 

    INSERT触发器在INSERT 语句执行以前或以后执行。须要知道如下几点:

 

        一、INSERT触发器代码内,可引用一个名为 NEW的虚拟表,访问被插入的行。

 

        二、BEFORE INSERT触发器中, NEW中的值也能够被更新(容许更改被插入的值);

 

        三、对于 AUTO_INCREMENT列,NEW INSERT执行以前包含 0,在INSERT执行以后包含新的自动生成值。

 

 

drop trigger if exists test_trigger;  ##删除触发器
delimiter//  ##改变语句分割符
create trigger test_trigger after insert on aaa_test    ##建立触发器test_trigger,当表aaa_test插入数据后执行
for each row    ##FOR EACH ROW是触发器的执行间隔,FOR EACH ROW子句通知触发器每隔一行执行一次动做,而不是对整个表执行一次
begin
    select new.id into @aaa;    ##将aaa_test表中id列的最新的值保存到用户变量@aaa中
end//

往表aaa_test中插入一行数据:spa

INSERT INTO aaa_test(username,PASSWORD,birthday) VALUES('test_trigger','12345',CURRENT_DATE);

此时表aaa_test中的结果:code

 

查看标量@aaa的结果,执行 :  "SELECT @aaa",其结果等于最新id值blog

 

 

DELETE触发器
    DELETE 触发器在DELETE 语句执行以前或以后执行。须要知道如下两点:
        一、 DELETE触发器代码内,你能够引用一个名为 OLD 的虚拟表,访问被删除的行;
        二、OLD 中的值全都是只读的,不能更新。

 

DROP TRIGGER IF EXISTS test_delete_trigger_before;
DELIMITER//
CREATE TRIGGER test_delete_trigger_before BEFORE DELETE ON aaa_test FOR EACH ROW
BEGIN
    SELECT old.id INTO @bbb;   ##将要删除数据行的id值保存到变量@bbb中
END//

删除以前aaa_test表中数据为:事件

删除id=48的记录,执行:ip

DELETE FROM aaa_test WHERE id=48;

查看变量@bbb,执行:it

SELECT @bbb;

 其结果为48:class

 

UPDATE触发器
    UPDATE 触发器在UPDATE 语句执行以前或以后执行。须要知道如下几点:
        一、 UPDATE触发器代码中,你能够引用一个名为 OLD 的虚拟表访问之前( UPDATE 语句前)的值,引用一个名为 NEW 的虚拟表访问新更新的值;
        二、 BEFORE UPDATE触发器中, NEW 中的值可能也被更新(容许更改将要用于 UPDATE 语句中的值);
        三、OLD 中的值全都是只读的,不能更新。

 

DROP TRIGGER IF EXISTS test_update_trigger_before;
DELIMITER//
CREATE TRIGGER test_update_trigger_before BEFORE UPDATE ON aaa_test
FOR EACH ROW
BEGIN
    SELECT UPPER(old.password) INTO @ccc;  ##将修改以前的值保存到@ccc变量中
    SELECT LOWER(new.password ) INTO @ddd;  ##将修改后的新值保存到@ddd变量中
END//

修改密码以前:test

修改密码:

update  aaa_test set password='helloWorld' where id=49;

变量@ccc结果为修改以前的值:

SELECT @ccc;

 

变量@ddd结果为修改后的值:

SELECT @ddd;

 

 

    【注】: MySQL 触发器中不支持 CALL语句。这表示不能从触发器内调用存储过程。所需的存储过程代码须要复制到触发器内。
 
    关于何时使用new,old这两个关键字就好像字面意思新旧同样:
         INSERT 只有NEW
         UPDATE既有NEW又和OLD
         DELETE只有OLD 
    因此对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句能够在和NEW以及 OLD同时使用
相关文章
相关标签/搜索