触发根据另一个表记录更新计数

问题描述 投票:0回答:2

我有这两个表的评论和列表

| listing_id |          review_id         |       comment      |
|------------|----------------------------|--------------------|
|  5629709   |              123           |      Beautiful     |
|  4156372   |              231           |      Wonderful     |
|  4156372   |              432           |      Very Good     |
|  4156372   |              649           |      Excellent     |



| listing_id |      number_of_reviews     |
|------------|----------------------------|
|  5629709   |               1            |
|  4156372   |               2            |

有没有办法创建一个触发器函数,当Review表有更新(插入或删除)时,列表中的number_of_reviews列也会更新(+ 1或-1)?

postgresql
2个回答
0
投票

实现可以从其他值计算的值具有严重的不一致风险。如果可能的话避免这样

在您的情况下,删除number_of_reviews中的listing列并创建一个视图来计算该列的数字。

CREATE VIEW listing_with_number_of_reviews
AS
SELECT l.listing_id,
       count(r.review_id) number_of_reviews
       FROM listing l
            LEFT JOIN review r
                      ON r.listing_id = l.listing_id
       GROUP BY l.listing_id;

0
投票
CREATE OR REPLACE FUNCTION function_number_of_reviews() RETURNS TRIGGER AS
$BODY$
BEGIN
    if TG_OP='INSERT' then
       Update public."Listing" set number_of_reviews = number_of_reviews + 1 where id = new.listing_id;
    end if;
    if TG_OP='DELETE' then
        Update public."Listing" set number_of_reviews = number_of_reviews - 1 where id = old.listing_id;
    end if;
    RETURN new;
END;
$BODY$
language plpgsql;

CREATE TRIGGER trig_number_of_reviews
     AFTER INSERT OR DELETE ON public."Review"
     FOR EACH ROW
     EXECUTE PROCEDURE function_number_of_reviews();

这是正确的方式

© www.soinside.com 2019 - 2024. All rights reserved.