2012-08-30 25 views
6

を私は次のトリガーがあります。MySQLのトリガがテーブル更新することはできません - 取得ERROR 1442

CREATE TRIGGER sum 
AFTER INSERT 
ON news 
FOR EACH ROW 
UPDATE news SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

をそれは、テーブルのint_viewsext_views列を合計し、合計ページビューでそれらを分割します。

私はニュースに新しい行を追加しようとするたびに、私は次のエラーを取得する:

ERROR 1442 (HY000) at line 3: Can't update table 'news' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

トリガーは私には非常に簡単と思われます。トリガが実行されない理由はありますか?許可されていないテーブルを、変更の両方 - あなたはINSERTトリガー内(すべての行の)UPDATEを実行していることを

+1

なし 'WHERE'条件? – jcho360

+0

@ jcho360、申し訳ありませんが、どこに条件を含めるべきかわかりません。私は挿入された後、すべての行でトリガーを実行します。 – egidra

+1

それがうまくいけない場合は、私が最後に – jcho360

答えて

9

症状は、あります。私が正しくあなたのトリガの意図を推測するならば、あなたはすべての行を更新したいが、唯一の新しく挿入された行はありません、と述べた

。あなたはそれが表に書き込まれる前に、行を変更したいと、これは、BEFORE INSERTトリガーであること

CREATE TRIGGER sum 
BEFORE INSERT 
ON news 
FOR EACH ROW 
SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

マインドで簡単にそれを達成することができます。

+0

と同じ問題を出して、ちょうどUPDATEのtlbの部分を削除しなければならなかったのです - ありがとう! – Smith

6

アップデートしようとした場合/トリガーを起動、同じテーブルに挿入するには、これは動作しません

-> UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION_LIST; 
-> INSERT INTO TABLE_NAME VALUES("VALUE1","VALUE2"); 

のような共通sqlコマンドを使用しないでください。 setを使用して、更新する列の値を割り当てます。

例:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name 
FOR EACH ROW 
SET NEW.COLUMN_NAME = "VALUE"; 
+0

これは合理的かつ合理的な対応でした。それは私が適切にエラーを解決するのに役立ちました。ありがとうございました! – itsraghz

関連する問題