sql >> データベース >  >> RDS >> PostgreSQL

postgres。 plpgsqlスタックの深さ制限を超えました

    さて、本当に更新時にトリガーが必要な場合は、このトリガーを列固有に設定して、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であることを確認してください トリガーしないと、新しく挿入/削除された行はカウントに含まれません。



    1. 列番号を使用してMySQLのテーブルから列を削除する方法

    2. PostgresqlとMySQL:それらのデータサイズは互いにどのように比較されますか?

    3. タブ区切りファイルを関係を使用してmysqlに挿入する方法

    4. 正規表現を使用してtnsnames.oraを解析する