2012-02-15 23 views
-1

私は現在、次のMySQLクエリを持っています。これは別のクエリではなく、トリガに含めることにします。接合可能である2つの表にクエリ更新データ:INSERTトリガーから2つのテーブルの結合された行を更新する

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に持つべきです(SHOULD)。 testing_namesに行が挿入された後、次に更新クエリを実行すると、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 ; 

が、明らかに行を挿入すると、私はエラーを取得するため、新しいUPDATEクエリは、許可されていない実行している:#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

+0

さらに詳しい情報として、 'testing_names'のBEFORE INSERTトリガーの一部として、BEGIN ... ENDの中の' purchase_names'テーブルでSELECTとUPDATEステートメントを実行することで、すべてを行うことができました。 – SimonMayer

0

代わりにINSertを使用してみてください

関連する問題