Mysql

觸發器問題和插入 .. 重複鍵更新

  • May 10, 2016

我有兩個具有相同架構的表。一個是定期修剪並保持較小的“主”表。另一個是“報告”表,它是所有內容的存檔。為簡單起見,假設表模式看起來像

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 事件不會觸發觸發器。

我已經嘗試了與您嘗試做的相同的操作,並且得到了所需的結果,實際上在定義觸發器時存在一些問題。我進行了更正,並且更正的觸發器如下。使用這些而不是您的觸發器,然後執行插入或更新操作,相信您的問題會得到解決。

delimiter ;;
create trigger reporting_insert after insert on main_table
   for each row 
     begin
       insert into reporting_table set
           id=NEW.id,
           value=NEW.value;
end;;
delimiter ;;

create trigger reporting_update after update on main_table
   for each row 
     begin
       insert into reporting_table set
           id=NEW.id,
           value=NEW.value;
end;;

insert into main_table values (1,10) on duplicate key update value=value+1;

引用自:https://dba.stackexchange.com/questions/30199