2012-02-01 8 views
2

まあ、私が研究していると私はメッセージのテーブルにINSERTを実行したときに'SQL Error (1442): Can not update table' messages' in stored function/trigger because it is already used by statement Which invoked this stored function/trigger.が私のトリガーが作成された `トリガーエラー、MySQLの

、のみ、このエラーがスローされる次のような問題の解決策を見つけていません、私のトリガーはとにかく

あなたはそのトリガー内のトリガーに関連付けられているテーブルに書き込むことはできませんMySQLのために、正しい

DELIMITER $$ 
DROP TRIGGER IF EXISTS `onMessage` ; 
CREATE TRIGGER `onMessage` BEFORE INSERT ON `messages` FOR EACH ROW 
BEGIN 
     UPDATE `users` SET `users`.`messages` = (`users`.`messages` + 1) 
     WHERE `users`.`uid` = NEW.uid ; 
     DELETE FROM `messages` WHERE `date` < (NOW() - INTERVAL 1 MINUTE) ; 
END ; 
$$ 
DELIMITER ; 

答えて

4

にINSERTに対処するためにストアドプロシージャを使用したい以上、矛盾のすべての方法をしない生成しますトリガーの使用における制限。 MySQLのdocumentationsから

:ストアド・ファンクションまたはトリガー内

は、既に関数またはトリガーを起動ステートメントによって(読み出しまたは書き込みのために)使用されているテーブルを修正することを許可されていません。

2

です。これは、MySQLのトリガがこの場合には行毎(RBAR)

処理されるので、私はこれはmessages

0

トリガがトリガされるテーブルを更新することはできません。トリガは、Mysqlがそのテーブルにいくつかのロックをかけるためです。したがって、同じテーブルの行を挿入/更新/削除することはできません。なぜなら、トリガーは繰り返し呼び出され、再帰で終わるからです。

自分自身を更新する(この場合は削除を実行する)テーブルにトリガーを作成する場合は、NEW.column_nameを使用して更新後の行を参照するようにしてください。

関連する問題