2012-02-10 13 views
3

私はMySQL 5.5.9とInnoDBを実行しています。AFTER INSERTで実行されるテーブルを更新できません

currentフィールドがレコードが最新バージョンであるかどうかを示すバージョン付きテーブルを作成しようとしました。ような何か:

| autonumber | id | name | current 
| 1   | 1 | Yes | 0 
| 2   | 1 | No | 1 

とにかく、私はcurrent = 0に同じIDを持つすべてのレコードを更新しAFTER INSERTトリガーを経由してかなり頻繁にMSSQLに、過去にこれをしませんでした。そこでここでは、MySQLに行く:

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products 
FOR EACH ROW BEGIN 
    UPDATE Products 
    SET current = 0 
    WHERE id = new.id 
     AND current = 1 
     AND autonumber <> new.autonumber; 
END; 
| 

これは細かい動作しますが、レコードを挿入する場合:

insert into Products (id, name) 
values (1, "Hello SO!"); 

を私は次のエラーを取得する:

Error Code: 1442. Can't update table 'Products' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

はこれを回避する方法はあります同様のことを達成するために?

答えて

2

はここhttp://forums.mysql.com/read.php?99,122354,122505#msg-122505

when you insert a record mysql is doing some lock stuff. you can't insert/update/delete rows of the same table where you insert.. because then the trigger would called again and again.. ending up in a recursion

+0

私はロックしていません、レコードは既に更新されています。 –

+0

あなたはそれをロックしています:)))ロックされているものを更新すると、それは動作します。行、ページ、表などのいずれかです。私が書いたように、BEFOREトリガーを試してみてください。 –

0

MySQLでは、トリガでトリガを作成するテーブル( 'Products')を更新することはできません。

MySQLのドキュメントによれば、このエラーは無限再帰を防ぐために生成されます。UPDATEが発生すると、トリガが実行され、テーブルが更新されます。このトリガUPDATEによってトリガが再度実行されます。無限ループであなたはMySQLがいくつかのロックのものをやっているレコードを挿入する際

+0

だと思います。 –

+0

最終的にBEFOREトリガーを使用しようとしました –

+1

プロシージャーで同じ更新作業を試すことはできますか? –

0

から撮影します。挿入した同じテーブルの行を挿入/更新/削除することはできません。なぜなら、トリガーは繰り返し呼び出されるからです。再帰で終了します。

私はこの問題を抱えていました。私は更新コマンドを削除しました。だから、これを試してみてください:

DELIMITER | 

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products 
FOR EACH ROW BEGIN 

    SET current = 0 
    WHERE id = new.id 
     AND current = 1 
     AND autonumber <> new.autonumber; 
END; 
| 

私は、これはエラーが言っていることだが、私はそれを回避する方法を探していますつもり作業

関連する問題