3
CREATE TRIGGER `after_customer_insert`
AFTER INSERT ON `customer`
FOR EACH ROW BEGIN
    UPDATE `user`
    SET
        `customers_count` = `customers_count` + 1
    WHERE `id` = NEW.`user_id`;
END$$

UPDATE userの新しい行ごとに呼び出す代わりにcustomer、トリガーを「全体」として持つことは可能でしょうか? 私は次のようなことを意味します

CREATE TRIGGER `after_customer_insert`
AFTER INSERT ON `customer`
BEGIN
    UPDATE `user`
    SET
        `customers_count` = (
            SELECT COUNT(`id`)
            FROM `customer`
            WHERE `user_id` = `id`
        )
END$$
4

3 に答える 3

2

Jake が指摘するように、トリガーは主に、 1 つの行の変更に関連するアクションを実行するために使用することを目的としています。通常は、別の 1 つの行を変更します。もちろん、更新された行ごとにほぼ同じ結果セットに対して同じアクションを (冗長に) 実行するロジックを実装することはできますが、問題は、UPDATE元の の後に単一のステートメントを発行しない理由UPDATEです。これには正当な理由があるかもしれません。したがって、全体的な状況についてのジェイクの質問です。

例 (構文テストされていませんが、一般的な考え方は保持されます)

UPDATE u set u.customer_count = x.newcount
from
user u inner join 
(
select user, count(*) as newcount
from user group by customer_id
) x
于 2012-08-19T09:18:36.123 に答える
1

まあ、一度自分でやったのでうまくいきます。新しい挿入が発生するたびに、テーブルでいくつかのことを注文しますが、私の観点では、それは良い習慣ではありません。おそらく、この問題を解決するためにコードを改善できる可能性があります。

また、このトリガーがテーブルのすべての行を処理する場合でも、INSERT が発生するたびに呼び出されます...

全体的な状況の説明を提供していただけないでしょうか。より良い解決策を見つけるお手伝いができるかもしれません... :-)

于 2012-08-19T09:11:56.187 に答える
0

そのようなタイプのトリガーが必要になる可能性がある唯一のケースは、クエリの場合です。

INSERT INTO customer SELECT * FROM customer_old;

ただし、この場合、クエリの前にトリガーを無効にし、insert-update を実行してトリガーを有効に戻すことができます。

一度に複数の顧客を挿入することがよくあるとは思えません。または、それが真実であっても、時期尚早の最適化を行おうとしています。

于 2012-08-19T09:30:40.743 に答える