在mysql觸發器中,當我在表A
上執行「更新後」,然後使用「for each row」時,它會在A
每次更新行時運行A
中每行的觸發器主體,它表示將觸發器應用於A
中的每一行,然後如果一行被更新,它只會爲該更新行僅運行主體代碼?「每行」在mysql中的觸發器中如何工作?
感謝
在mysql觸發器中,當我在表A
上執行「更新後」,然後使用「for each row」時,它會在A
每次更新行時運行A
中每行的觸發器主體,它表示將觸發器應用於A
中的每一行,然後如果一行被更新,它只會爲該更新行僅運行主體代碼?「每行」在mysql中的觸發器中如何工作?
感謝
字面上 - MySQL將運行觸發器代碼爲每一個而被受人們的SQL語句行。
而不是表A中的每一行本身。
觸發器不應用於每一行,它只是說爲每個受影響的錶行執行觸發器主體。
FOR EACH ROW
說什麼時候應該執行,而不是創建觸發器的地方。
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)