0

こんにちは、みんな :)!

基本的に、parent_id 列を介して自身を参照するテーブルが 1 つあります。テーブルの各行は親を持つことができ、count 列を介していくつの子を持つかを数えることができます。したがって、本質的に私がやろうとしているのは、必要に応じてトリガーが各親行のカウント列を更新することです

問題は、挿入トリガーの更新操作が呼び出されると、更新トリガーが呼び出されることです。それから私は得る:

「一般エラー: 1442 このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'term_taxonomies' を更新できません」 .

何か案は?

実際のコード:

TRIGGER `dbname`.`ai_term_taxonomies`
AFTER INSERT ON `dbname`.`term_taxonomies`
行ごとに
始める
    IF NEW.parent_id NOT 0 THEN
        UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount + 1)
        WHERE termTax.term_taxonomy_id = NEW.parent_id;
    END IF;

END$$

作成
TRIGGER `dbname`.`au_term_taxonomies`
`dbname`.`term_taxonomies` の更新後
行ごとに
始める

    IF NEW.parent_id NOT OLD.parent_id THEN
        IF NEW.parent_id NOT 0 THEN
            UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount + 1)
            WHERE termTax.term_taxonomy_id = NEW.parent_id;
        END IF;
        IF OLD.parent_id NOT 0 THEN
            UPDATE term_taxonomies as termTax SET assocItemCount = (assocItemCount - 1)
            WHERE termTax.term_taxonomy_id = OLD.parent_id;
        END IF;
    END IF;

END$$
4

1 に答える 1

0

すべての mysql トリガーは、トリガー ステートメントと同じトランザクションで実行されます。

基になるテーブルでステートメントSET NEW.assocItemCountを実行するのではなく、構文を使用して更新する場合。UPDATE

編集:ただし、あなたの場合、同じテーブルの別の行を更新しているため、これは不可能です。これは、mysqlトリガーで行うのが最も難しいことです。ごめん。

スキーマを変更する必要があります。テーブルから取り出し、 と だけをassocItemCount保持する新しいテーブルを作成し、クエリのステートメントを使用して更新します。クエリで元のスキーマを使用する必要がある場合は、これら 2 つのテーブルを結合するビューを使用してこの詳細を非表示にすることもできます。term_taxonomy_idassocItemCountUPDATE

または、データベースにまったく含まれていない場合assocItemCountでも、任意のクエリで計算でき、データベースは現在よりも適切に正規化されます。

于 2012-05-23T21:01:06.190 に答える