2012-02-15 75 views
-1

我目前有以下MySQL查詢,我希望將其包含在觸發器中,而不是作爲單獨的查詢。在兩個表中,其查詢的更新數據是可接合的:從INSERT觸發器更新兩個表中的連接行

UPDATE `testing_names` INNER JOIN `purchase_names` 
    ON `testing_names`.`fulldomain` = `purchase_names`.`fulldomain` 
SET 
    `testing_names`.`account_id` = `purchase_names`.`account_id`, 
    `purchase_names`.`purchase_status` = 1 
WHERE `purchase_names`.`purchase_status` = 0 

行是(分別)插入testing_names。這一行應該在purchase_names中有相應的條目。在將一行插入testing_names後,當我的UPDATE查詢下次運行時,它將更新testing_names.account_id並更新purchase_names.purchase_status以有效地將此任務標記爲已完成。

將此作爲觸發器的一部分來運行是有意義的,但我無法創建執行此任務的觸發器。

到目前爲止,我已經成功地創建了一個觸發器:

DELIMITER $$ 
    CREATE TRIGGER `my_trigger` AFTER INSERT 
    ON testing_names 
     FOR EACH ROW BEGIN 
     UPDATE `testing_names` INNER JOIN `purchase_names` 
      ON `testing_names`.`fulldomain` = `purchase_names`.`fulldomain` 
     SET 
      `testing_names`.`account_id` = `purchase_names`.`account_id`, 
      `purchase_names`.`purchase_status` = 1 
     WHERE `purchase_names`.`purchase_status` = 0; 
     END$$ 
DELIMITER ; 

但顯然運行一個新的更新查詢是不允許的,因爲在插入一排,我得到一個錯誤:#1442 - Can't update table 'testing_names' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

回答

1

不幸的是,表上的觸發器無法更新同一個表。

MySQL documentation

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

相反,你可能能夠通過其對testing_names更新purchase_names觸發器來完成您的更新和對purchase_names更新testing_names另一個觸發。

+0

謝謝。似乎也不可能用相互更新觸發器來做到這一點。我目前正在研究如何使用'testing_names' BEFORE INSERT觸發器來調整'testing_names',然後使用AFTER INSERT調整'purchase_names'。這應該否定對'purchase_names' AFTER UPDATE觸發器的任何需要,我相信這會導致錯誤。 – SimonMayer 2012-02-16 09:47:04

+0

有關詳細信息,我可以在'testing_names'的BEFORE INSERT觸發器上執行所有操作,方法是在BEGIN ... END內部的'purchase_names'表上運行SELECT和UPDATE語句。 – SimonMayer 2012-02-16 19:13:10

0

嘗試使用之前的插入而不是