2017-06-04 102 views
1

我想使用觸發器在2個不同數據庫的2個表中獲得數量字段同步。MySQL錯誤1442使用2個觸發器更新2個不同數據庫上的2個表的字段

我發現了一些例子,並試圖使其適應這一需求,爲什麼不成功,顯示這個錯誤...

#1442 - 在存儲函數/觸發無法更新表「oc_product」,因爲它是已經用於調用這個存儲的函數/觸發器的語句。

...試圖perfom此查詢時:

UPDATE `db`.`oc_product` SET `quantity` = '220' WHERE `oc_product`.`product_id` = 50 

觸發對於DB2,表中的股票:

DROP TRIGGER IF EXISTS t1_ai && 

CREATE TRIGGER t1_ai BEFORE UPDATE ON stock FOR EACH ROW BEGIN 
    IF @__disable_trigger_t1t2 = 1 THEN 
    SET @__disable_trigger_t1t2 = NULL; 
    ELSE 
    SET @__disable_trigger_t1t2 = 1; 
    -- trigger logic goes in here 
    UPDATE `db1`.oc_product 
    SET `quantity` = NEW.quantity 
    WHERE SKU = NEW.SKU; 
    END IF; 
END && 

觸發爲DB1,表oc_product:

DROP TRIGGER IF EXISTS t2_ai && 

CREATE TRIGGER t2_ai BEFORE UPDATE ON oc_product FOR EACH ROW BEGIN 
    IF @__disable_trigger_t1t2 = 1 THEN 
    SET @__disable_trigger_t1t2 = NULL; 
    ELSE 
    SET @__disable_trigger_t1t2 = 1; 
    -- trigger logic goes in here 
    UPDATE `db2`.stock 
    SET `quantity` = NEW.quantity 
    WHERE SKU = NEW.SKU; 
    END IF; 
END && 

任何想法如何解決這個錯誤?

額外信息: 如果我perfom這個查詢庫存表上的DB2:

UPDATE `db2`.`stock` SET `quantity` = '220' WHERE `stock`.`id` = 7631; 

則觸發t1_ai做的工作,而不是反過來

+0

可能重複[我的MySQL觸發器不起作用,語法簡單,不復雜](https://stackoverflow.com/questions/40517731/my-mysql-trigger-doesnt-work-simple-syntax-not-複雜) – e4c5

+0

我不這麼認爲,爲什麼其他觸發器不能完成這項工作?這是什麼原因? –

+0

你有一個觸發器觸發anotehr,更新你不允許修改的表格之一。在這種情況下,表名爲股票 – e4c5

回答

1

原因:不能更新/刪除/插入觸發器被調用的表(庫存):

在存儲的函數或觸發器中,不允許mo不同的 表已被調用函數或觸發器的 語句使用(用於讀取或寫入)。

這樣做將產生錯誤1442:

Error Code: 1442 
Can't update table 'oc_product' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

這到底是怎麼發生的,UPDATEstock表觸發第一個觸發器「t1_ai」這是SQL嘗試更新oc_product表,其中有一個觸發't1_ai',它嘗試更新/更改stock表。 所以,你上面提到:

它不允許修改一個已經被使用(用於 閱讀

對於這樣的表整個流程(級聯觸發器)stock仍在使用中(因此被鎖定以供進一步讀取或寫入),即在這些級聯觸發器被觸發的第一個表更新中。


建議: 嘗試實施過程,並通過您的應用程序調用它。

+0

謝謝,我通過實施您的建議來解決它 –