有看到资料说,
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执行没有差别吗?
在上例中,应该怎么理解他们之间的差别呢?
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执行没有差别吗?
在上例中,应该怎么理解他们之间的差别呢?
BEFORE UPDATE 就是执行完这个触发器的语句,再执行你的更新
按照上面的例子,
那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
是吗?
BEFORE UPDATE 就是执行完这个触发器的语句,再执行你的更新
只有在特定需求的时候使用after和before才有效.
MSSQL里面,for,after都是在动作之后触发。
没有before,有insert of 触发器。
我用的是MySQL啊。
没看懂你说的~
建议到MYSQL版问问。
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);
我理解的是:
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这个东西啊,所以
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扩展。
你做了UPDATE操作,NEW和OLD就已经存放了你新的值和旧的值了..
只是BEFORE这时候它的NEW的值放在了高速缓存中,还没有真正写入到数据库.
而AFTER已经将NEW的值写入数据库了..
BEFORE时间的触发器,可以在数据还没有写入到数据库的时候进行一些处理.比如我要更新的值是col = 10,但是我希望它在数据库中的表现是2009060100010..
这时就可以用BEFORE触发器..来SET NEW.col= xxx的形式来设置新的值...
-------------------
所以看看你的set @sum_auo=@sum_auo+new.acct_num;
就只是理解上的问题了..
就是说:
BEFORE UPDATE操作---
1.就是说数据库的操作,数据已经改变,只是没有写入到数据库中去,而是缓存了起来。
2.然后执行触发器的语句,这时从缓存中读取New的(改变过后)的数据。
3.最后,用缓存中的数据更新数据库。
不知道我以上的理解对不对?~
before--前触发
after--后触发
简单点理解就行了