有看到资料说,
   before---表示在数据库动作之前触发器执行
   after---表示在数据库动作之后触发器执行有数据表account(acct_num)。
       |acct_num|
      |12|
      |100|
      |22|
      |33|有如下两个触发器
触发器一:ins_sum_auo 
     
     CREATE TRIGGER ins_sum_auo AFTER UPDATE ON account 
     FOR EACH ROW set @sum_auo=@sum_auo+new.acct_num;
     
触发器二:ins_sum_buo 
     
     CREATE TRIGGER ins_sum_buo BEFORE UPDATE ON account 
     FOR EACH ROW set @sum_buo=@sum_buo+new.acct_num;
     我执行以下两个操作:set @sum_auo=0;
update account set acct_num="10" where acct_num="100";
select @sum_auo以及set @sum_buo=0;
update account set acct_num="10" where acct_num="100";
select @sum_buo为什么最后的结果都是一样的呢?
在触发器语句里边,after和before执行没有差别吗?
在上例中,应该怎么理解他们之间的差别呢?

解决方案 »

  1.   

    AFTER UPDATE 也就是执行完你的更新之后.再执行这个触发器的语句..
    BEFORE UPDATE 就是执行完这个触发器的语句,再执行你的更新
      

  2.   


    按照上面的例子,
    那AFTER UPDATE的执行顺序可以理解成:1.set @sum_auo=0;
    2.update account set acct_num="10" where acct_num="100";
    3.set @sum_auo=@sum_auo+new.acct_num;
    4.select @sum_auo而
    BEFORE UPDATE的执行顺序可以理解成:1.set @sum_buo=0;
    2.set @sum_auo=@sum_buo+new.acct_num;
    3.update account set acct_num="10" where acct_num="100";
    4.select @sum_buo
    是吗?
      

  3.   

    AFTER UPDATE 也就是执行完你的更新之后.再执行这个触发器的语句.. 
    BEFORE UPDATE 就是执行完这个触发器的语句,再执行你的更新
      

  4.   

    像你这样的操作,有没有after和before都一样.
    只有在特定需求的时候使用after和before才有效.
      

  5.   

    楼主,你的是MYSQL吧?
    MSSQL里面,for,after都是在动作之后触发。
    没有before,有insert of 触发器。
      

  6.   

    是啊,
    我用的是MySQL啊。
    没看懂你说的~
      

  7.   

    MSSQLMYSQL语法是不一样的。
    建议到MYSQL版问问。
      

  8.   

    DROP TABLE IF EXISTS ta;
    DROP TABLE IF EXISTS tb;CREATE TABLE ta(name varchar(20));CREATE TABLE tb(name varchar(20));DELIMITER $$
    CREATE TRIGGER tri BEFORE UPDATE ON ta    
    -- 第二次测试时,将BEFORE改为AFTER将得到错误
    FOR EACH ROW
    BEGIN
        SET new.name = UPPER(new.name);    INSERT tb VALUES(CONCAT('old','  ||  ',old.name));
        INSERT tb VALUES(CONCAT('old','  ||  ',new.name));
    END$$
    DELIMITER ;-- ------------------------------------------------INSERT ta VALUES('liang');update ta SET name = concat(name,',',name);
      

  9.   

    设计的例子不能测出befor和after的区别..
      

  10.   

    楼上的梁版已经解释得很清楚了。或者楼主可以说一下,你的想象有 before 和 after 应该有什么样的区别?比如说你认为结果应该是什么?并且为什么?
      

  11.   


    我理解的是:
    after update的话,就是在update之后,执行
         set @sum_auo=@sum_auo+new.acct_num;操作。
         
    before update的话,就是在update之前,就做
         @sum_buo=@sum_buo+new.acct_num;操作。
    这样,before update的话,不是还没改变吗,没有new.acct_num这个东西啊,所以
         
      

  12.   

    原来是这方面的理解问题。看一下MySQL对NEW,OLD的介绍。在其它数据库中基本也是如此。http://dev.mysql.com/doc/refman/5.1/zh/triggers.html#using-triggers
    21.3. 使用触发程序
    使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。OLD和NEW是对触发程序的MySQL扩展。
      

  13.   

    打开18楼的链接,然后按ctrl+F ,输入 '使用OLD和NEW关键字' 回车,你就找到了。
      

  14.   

    这样说吧.
    你做了UPDATE操作,NEW和OLD就已经存放了你新的值和旧的值了..
    只是BEFORE这时候它的NEW的值放在了高速缓存中,还没有真正写入到数据库.
    而AFTER已经将NEW的值写入数据库了..
    BEFORE时间的触发器,可以在数据还没有写入到数据库的时候进行一些处理.比如我要更新的值是col = 10,但是我希望它在数据库中的表现是2009060100010..
    这时就可以用BEFORE触发器..来SET NEW.col= xxx的形式来设置新的值...
    -------------------
    所以看看你的set @sum_auo=@sum_auo+new.acct_num;
    就只是理解上的问题了..
      

  15.   


    就是说:
    BEFORE UPDATE操作---
    1.就是说数据库的操作,数据已经改变,只是没有写入到数据库中去,而是缓存了起来。
    2.然后执行触发器的语句,这时从缓存中读取New的(改变过后)的数据。
    3.最后,用缓存中的数据更新数据库。
    不知道我以上的理解对不对?~
      

  16.   

    不要钻牛角尖咯
    before--前触发
    after--后触发
    简单点理解就行了