私はphpサイトの簡単なフォーラムを書いています。各カテゴリの投稿数を計算しようとしています。これで、カテゴリは別のカテゴリに属することができ、ルートカテゴリはNULLのparent_category_idを持つものとして定義されます。このアーキテクチャでは、カテゴリに無制限の数のサブカテゴリを含めることができ、テーブル構造をかなり単純に保つことができます。
簡単にするために、カテゴリテーブルに3つのフィールドがあるとします:category_id
、、。残りのデータベース構造は適切ではないと思うので、ここでは省略します。parent_category_id
post_count
もう1つのトリガーは、categoriesテーブルを呼び出して、このトリガーを実行することです。私が欲しいのは、投稿数を更新してから、各親カテゴリを再帰的に調べて、その投稿数を増やすことです。
DELIMITER $$
CREATE TRIGGER trg_update_category_category_post_count BEFORE UPDATE ON categories FOR EACH ROW
BEGIN
IF OLD.post_count != NEW.post_count THEN
IF OLD.post_count < NEW.post_count THEN
UPDATE categories SET post_count = post_count + 1 WHERE categories.category_id = NEW.parent_category_id;
ELSEIF OLD.post_count > NEW.post_count THEN
UPDATE categories SET post_count = post_count - 1 WHERE categories.category_id = NEW.parent_category_id;
END IF;
END IF;
END $$
DELIMITER ;
私が得ているエラーは次のとおりです。
#1442 - Can't update table 'categories' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
投稿の総数を計算するために各ページの読み込みでcount()を実行できると思いますが、大規模なフォーラムでは、ここで何度も説明されているように、処理が遅くなります(たとえば、phpで投稿をカウントするかデータベースに保存します)。したがって、将来の保証のために、投稿数をテーブルに保存しています。さらに一歩進むために、PHPではなくトリガーを使用してこれらのカウントを更新すると思いました。
MySQLには、更新されている同じテーブルでトリガーを実行するための制限があることを理解しています。これがこのエラーの原因です(つまり、無限ループを停止します)が、この場合、ループはNULLのparent_category_idを持つカテゴリに到達すると確実に停止します。 ?このトリガーを調整する場合でも、まったく異なるものにする場合でも、何らかの解決策が必要です。ありがとう。
編集私はこれが物事を行うための最良の方法ではないかもしれないことを感謝しますが、それは私が考えることができる最良のことです。親のカテゴリを別のカテゴリに変更すると、混乱する可能性がありますが、これは、すべてを再同期する別のトリガーによって修正できます。私はこの問題を解決する方法について他の提案を受け入れています。