Триггер для обновления столбца во время вставки в postgres - PullRequest
0 голосов
/ 26 января 2009

У меня есть две таблицы (в postgres) - реклама и логи. После каждой вставки в таблицу журналов в зависимости от действия следует увеличивать количество столбцов в таблице объявлений.

Я попытался написать функцию, которую вызовет триггер, но он выдает ошибку при попытке создать функцию. Я новичок в триггерах и функциях postgresql, поэтому кто-то может указать, что с этим не так.

create function update_ad_count (action character(4), ad_id INT) returns void 
as $$case when action='VIEW' then
(UPDATE ads SET views = (SELECT views+1 FROM ads WHERE id=ad_id), updated = now() WHERE id=ad_id;)
end;$$
language sql

Я получаю ошибку

ERROR:  syntax error at or near "case"
LINE 2: as $$case when action=\'VIEW\' then
             ^

Обновление: @ Томалак: Спасибо за функцию и обновление оператора обновления (не смог устоять перед каламбуром).

После большого количества поисков я понял, что функция не должна иметь никаких параметров и использовать NEW.col_name и должна возвращать TRIGGER.

Ответы [ 2 ]

2 голосов
/ 26 января 2009

Прежде всего, ваш вызов UPDATE должен быть:

UPDATE ads SET views = views + 1, updated = NOW() WHERE id = ad_id;

Согласно документации , что-то вроде этого должно сделать:

CREATE FUNCTION update_ad_count (action CHARACTER(4), ad_id INT) 
RETURNS VOID
AS $$ 
BEGIN
  IF action = 'VIEW' THEN
    UPDATE ads SET views = views + 1, updated = NOW() WHERE id = ad_id;
  END IF;
END;
$$ LANGUAGE plpgsql;

CASE не является оператором управления потоком, его нельзя использовать как оператор IF. Это оператор, производящий ценность (выражение), и должен использоваться как таковой, например, вы должны выбрать / обновить его.

0 голосов
/ 26 января 2009

Я не очень хорошо знаком с postgresql, но на основании того, что я знаю ... не должно ли это быть "$$ case" вместо "$$ case"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...