さて、本当に更新時にトリガーが必要な場合は、このトリガーを列固有に設定して、all_books
への更新時にトリガーされないようにします。 、再帰を引き起こしています。このようなもの-
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
もちろん、関数をトリガーする列を変更することもできます。copy_id
を選択しました。 それがあなたが数えているものだからです。
ただし
count()
で更新する場合 その結果、トリガーをINSERT
に置くだけで済みます およびDELETE
行動。このように、カウントが変更されたときにトリガーが起動しますが、更新によってトリガーされることはありません。 //編集:sum
以降 copies
内のすべてのレコードのカウントのみです 、レコードが挿入または更新されたときにのみ変更されるため、更新時にこのトリガーを実行しても意味がありません。
編集:CREATEへのリンクを追加すると便利だと思いましたTRIGGERドキュメント 。イベントの列を指定する方法について詳しく説明しているため、「イベント」というラベルの付いたセクションを参照してください。
新しい情報の編集:
達成する必要があると思われることを考えると、データ設計を再考する必要があると思います。親子関係を使用することをお勧めします(共有データは、共通の何かを共有しているため、テーブルの多くの行にキャッシュしているときはいつでも、代わりに親テーブルが必要になる可能性があることを示しています)。
books
を持っている 各行が1冊の本(タイトル、著者など)に関する情報であり、copies
があるテーブル 各行が本の1つのコピーに関する情報(シリアル番号、最後にチェックアウトされたものなど)を保持するテーブル。
このように、コピー数の取得は、SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
と同じくらい簡単です。 。
本当にカウントをどこかにキャッシュしたい場合は、books
でそれを行ってください テーブル。
INSERT OR UPDATE
を作成します copies
でトリガー UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
。
次に、DELETE
を作成します UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
2つのトリガーの理由は、NEW
変数はINSERT
でのみ使用できます またはUPDATE
トリガー、およびOLD
DELETE
でのみ使用可能です トリガー。すべてを1つのトリガーとして実行できますが、ここに配置したいよりも多くのコードが必要になります。
すべてのトリガーがAFTER
であることを確認してください トリガーしないと、新しく挿入/削除された行はカウントに含まれません。