我有两个具有相同架构的表。一个是定期修剪并保持较小的“主”表。另一个是“报告”表,它是所有内容的存档。为简单起见,假设表模式看起来像
create table main_table(
pk int unsigned not null primary key,
value int unsigned
);
create table reporting_table(
pk int unsigned not null primary key,
value int unsigned
);
我有两个触发器,一个是 AFTER INSERT,一个是 AFTER UPDATE,看起来像
create trigger reporting_insert after insert on main_table
for each row
insert into reporting_table (id,value) VALUES
(NEW.id, NEW.value);
create trigger trigger reporting_update after update on main_table
for each row
update reporting_table set
value=NEW.value
where
id=NEW.id;
主表填充有查询,如
insert into main_table values (1,10) on duplicate key update value=value+1;
我的问题是报告表没有捕捉到这个 ODKU +1 的值(它显然正在主表中更新)。
从触发器文档:
一个可能令人困惑的示例是 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语法:将为每一行激活 BEFORE INSERT 触发器,然后是AFTER INSERT触发器或BEFORE UPDATE 和 AFTER UPDATE触发器,具体取决于关于该行是否存在重复键。
从阅读中我认为它将遵循后一条路径执行任何更新之前/之后的触发器。对 main_table 执行直接 UPDATE 查询确实会导致更改传播到报告表。
我错过了什么?
在最近发表评论后,这个问题又引起了我的注意。
当时的这个问题原来是这个应该由触发器维护的报告表只在从站上。
重复键语句上的插入被标记为对于基于语句的复制不安全,并在 RBR 中被推送(流处于混合模式)。
RBR 事件不会触发触发器。
我已经尝试了与您尝试做的相同的操作,并且得到了所需的结果,实际上在定义触发器时存在一些问题。我进行了更正,并且更正的触发器如下。使用这些而不是您的触发器,然后执行插入或更新操作,相信您的问题会得到解决。