2012-03-28 4 views
0

私はMySQLにデータベースを持っています。ここにそれを作成するSQLクエリですhttp://paste.org.ru/?xzctqi行を挿入した後に列の値をインクリメントするトリガを作成する方法は?

ここにメインテーブルbooksです。私がする必要があるのは、本を追加するときに、出版社IDを選択することだけです。ブックを追加した後、このテーブルのすべてのレコードをループし、現在追加されている行と同じパブリッシャを持つすべての行に対してインクリメントカラムpublisher_books_amountを追加する必要があります。

+----+-------+--------+------------------------+-----------+ 
| id | title | author | publisher_books_amount | publisher | 
+----+-------+--------+------------------------+-----------+ 
| 1 | Book1 |  1 |      0 |   1 | 
| 2 | Book2 |  2 |      0 |   1 | 
| 3 | Book3 |  1 |      0 |   2 | 
| 4 | Book4 |  3 |      0 |   3 | 
| 5 | Book1 |  3 |      0 |   1 | 
+----+-------+--------+------------------------+-----------+ 

私はトリガー

DROP TRIGGER IF EXISTS `insert_trigger`; 
DELIMITER | 
CREATE TRIGGER `insert_trigger` AFTER INSERT ON books 
    FOR EACH ROW 
    BEGIN 
     UPDATE books SET publisher_books_amount = (publisher_books_amount + 1) 
     WHERE publisher = NEW.publisher; 
    END; 
    | 
DELIMITER ; 

を作成しました。しかし、私は本を追加しようとしているとき、MySQLはエラーを私に提供します。それは は既にこのストアド・ファンクション/トリガーを呼び出したステートメントで使用されているため

は/保存機能でトリガーをテーブル「ブック」を更新できません。

なぜ非正規化DBになっているのですか?私はちょうど上記の構造が必要です。

私は行を削除して更新した後に同じトリガを作成する必要があります。それに何か問題がある場合は、それも私を助けることができますか?

よろしくお願いいたします。

答えて

1

ループ内の更新は、無限ループになるため許可されません。 更新なしでtriigerを試してください。設定値はthis = thisだけです。

関連する問題