2012-02-15 49 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

尝试使用之前的插入而不是