2014-04-29 22 views
1

在mysql觸發器中,當我在表A上執行「更新後」,然後使用「for each row」時,它會在A每次更新行時運行A中每行的觸發器主體,它表示將觸發器應用於A中的每一行,然後如果一行被更新,它只會爲該更新行僅運行主體代碼?「每行」在mysql中的觸發器中如何工作?

感謝

回答

1

字面上 - MySQL將運行觸發器代碼爲每一個而被受人們的SQL語句行。

而不是表A中的每一行本身。

0

觸發器不應用於每一行,它只是說爲每個受影響的錶行執行觸發器主體。

FOR EACH ROW說什麼時候應該執行,而不是創建觸發器的地方。

3

FOR EACH ROW裝置對於每一個匹配行即得到任一更新刪除的。

除非查詢中存在where條件,否則觸發器主體將不會遍歷整個表數據。

一個工作示例如下所示:

創建樣本表

drop table if exists tbl_so_q23374151; 
create table tbl_so_q23374151 (i int, v varchar(10)); 

-- set test data 
insert into tbl_so_q23374151 
values (1,'one'),(2,'two'),(3,'three'),(10,'ten'),(11,'eleven'); 

-- see current data in table**: 
select * from tbl_so_q23374151; 
+------+--------+ 
| i | v  | 
+------+--------+ 
| 1 | one | 
| 2 | two | 
| 3 | three | 
| 10 | ten | 
| 11 | eleven | 
+------+--------+ 
5 rows in set (0.00 sec) 

樣品表記錄循環計數在觸發器主體

-- let us record, loop count of trigger, in a table 
drop table if exists tbl_so_q23374151_rows_affected; 
create table tbl_so_q23374151_rows_affected(i int); 

select count(*) as rows_affected from tbl_so_q23374151_rows_affected; 
+---------------+ 
| rows_affected | 
+---------------+ 
|    0 | 
+---------------+ 

定義刪除觸發

drop trigger if exists trig_bef_del_on_tbl_so_q23374151; 
delimiter // 
create trigger trig_bef_del_on_tbl_so_q23374151 before delete on tbl_so_q23374151 
    for each row begin 
    set @cnt = if(@cnt is null, 1, (@cnt+1)); 

    /* for cross checking save loop count */ 
    insert into tbl_so_q23374151_rows_affected values (@cnt); 
    end; 
// 

delimiter ; 

現在,測試刪除操作

delete from tbl_so_q23374151 where i like '%1%'; 

-- now let us see what the loop count was 
select @cnt as 'cnt'; 
+------+ 
| cnt | 
+------+ 
| 3 | 
+------+ 

現在,檢查主表觸發效果:

-- now let us see the table data 
select * from tbl_so_q23374151; 
+------+-------+ 
| i | v  | 
+------+-------+ 
| 2 | two | 
| 3 | three | 
+------+-------+ 
2 rows in set (0.00 sec) 

select count(*) as rows_affected from tbl_so_q23374151_rows_affected; 
+---------------+ 
| rows_affected | 
+---------------+ 
|    3 | 
+---------------+ 
1 row in set (0.00 sec)