#postgresql #triggers #sql-update
#postgresql #триггеры #sql-обновление
Вопрос:
Всякий раз, когда пользователь оценивает фильм, такой триггер должен вызываться и обновлять рейтинг фильма с рейтингом. Как мне извлечь значение movie_id из запроса insert into ratings values (movie_id, /*etc*/)
?
create trigger new_rating after insert on ratings
execute procedure update_movie_rating();
create or replace function update_movie_rating()
returns trigger
as $new_rating$
begin
update movies
set averagerating =
select avg(r.rating)
from ratings r
where r.movie_id = /*movieid fetched from insert query*/
return new;
end;
$new_rating$ language plpgsql;
Комментарии:
Ответ №1:
Предполагая, что поле в таблице «рейтинги» называется movie_id:
where r.movie_id = NEW.movie_id
Вы можете найти подробное объяснение здесь:
https://www.postgresql.org/docs/current/plpgsql-trigger.html
В любом случае, вас интересует эта конкретная часть:
Когда функция PL / pgSQL вызывается в качестве триггера, в блоке верхнего уровня автоматически создаются несколько специальных переменных. Они есть:
НОВОЕ:
ЗАПИСЬ типа данных; переменная, содержащая новую строку базы данных для операций ВСТАВКИ / ОБНОВЛЕНИЯ в триггерах на уровне строк. Эта переменная имеет значение null в триггерах уровня оператора и для операций УДАЛЕНИЯ.