事务场景下FOR EACH STATEMENT触发器执行规则相关问询
语句级触发器执行次数答疑
核心结论
FOR EACH STATEMENT(语句级触发器)的执行次数仅和你执行的符合触发条件的SQL语句数量相关,和事务数量、单条SQL影响的行数都没有关联,针对你提到的同事务下1000条插入的场景,分两种情况:
- 如果你是单独执行1000条单条
INSERT语句,触发器会执行1000次 - 如果你是用1条批量
INSERT语句一次性插入1000行数据,触发器仅执行1次
概念说明
语句级触发器定义中的“语句”,指的是你提交给数据库执行的单条DML(INSERT/UPDATE/DELETE/TRUNCATE)指令:
- 只要单条指令符合触发时机和触发条件,不管这条指令影响多少行数据,都只会触发一次语句级触发器
- 与之对应的行级触发器
FOR EACH ROW,才会按语句影响的行数触发,比如单条批量插入1000行的场景下,行级触发器会触发1000次 - 事务只是用来保证操作的原子性,不会改变触发器的计数逻辑,不管你是否将插入操作包在同一个事务中,只要执行的SQL语句数量不变,语句级触发器的执行次数就不会变
场景示例
场景1:同事务下1000条单条插入
BEGIN; INSERT INTO table_name(col) VALUES ('val1'); -- 触发1次 INSERT INTO table_name(col) VALUES ('val2'); -- 触发1次 -- 省略剩余998条单条INSERT语句 INSERT INTO table_name(col) VALUES ('val1000'); -- 触发1次 COMMIT;
以上场景触发器总执行次数为1000次。
场景2:同事务下1次批量插入1000行
BEGIN; INSERT INTO table_name(col) VALUES ('val1'), ('val2'), ..., ('val1000'); -- 仅触发1次 COMMIT;
以上场景触发器总执行次数为1次。
内容的提问来源于stack exchange,提问作者Banda89
相关产品推荐
相关产品推荐

