Триггер для обновления номера счетчика на основе записей другой таблицы

#postgresql

#postgresql

Вопрос:

У меня есть обзор и список этих двух таблиц

 | 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            |
 

Есть ли способ создать триггерную функцию, чтобы при обновлении таблицы просмотра (вставка или удаление) столбец number_of_reviews в таблице списков также обновлялся ( 1 или -1)?

Ответ №1:

 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();
 

Это путь Райта

Ответ №2:

Материализация значений, которые могут быть вычислены из других значений, сопряжена с серьезным риском несоответствий. Если возможно, избегайте этого.

В вашем случае поместите 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;
 

Комментарии:

1. @vkatsou: Почему нет, в чем проблема?