11

次のトリガーがあります。

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

int_views表の列と列を合計ext_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.

トリガーは私にはかなり単純に思えます。トリガーの実行に失敗する理由はありますか?

4

3 に答える 3

19

症状UPDATEは、トリガー内で (すべての行に対して) を実行していることです。INSERTどちらもテーブルを変更しますが、これは許可されていません。

とはいえ、トリガーの意図を正しく推測した場合、すべての行を更新するのではなく、新しく挿入された行のみを更新する必要があります。あなたはそれを簡単に達成することができます

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

BEFORE INSERTテーブルに書き込まれる前に行を変更したいので、これはトリガーであることに注意してください。

于 2012-08-30T19:22:39.670 に答える
9

トリガーを起動させる同じテーブルで更新/挿入しようとする場合は、sql次のような一般的なコマンドを使用しないでください

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

これは機能しません。更新する列の値を割り当てるためにのみ set を使用してください。

例:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name
FOR EACH ROW
SET NEW.COLUMN_NAME = "VALUE";
于 2014-12-22T08:54:05.760 に答える