在postgres中插入期间触发更新列

时间:2009-01-26 16:36:24

标签: postgresql triggers

我有两张桌子(在postgres中) - 广告和日志。每次插入日志表后,根据操作,它应该增加ads表中列的计数。

我曾尝试编写一个触发器将调用的函数,但在尝试创建函数时会抛出错误。我是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
             ^

更新 @Tomalak:感谢您的功能和更新更新声明(无法抵抗双关语)。

我经过大量的谷歌搜索后了解到,该函数不应该有任何参数并使用NEW.col_name并且应该返回一个TRIGGER。

2 个答案:

答案 0 :(得分:2)

首先,你的UPDATE调用应该是:

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

根据the documentation,这样的事情应该这样做:

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语句一样使用。它是一个产生价值的陈述(表达式),必须如此使用,例如你必须从中选择/更新。

答案 1 :(得分:0)

我对postgresql并不是很熟悉,但基于我所知道的......不应该是“$$ case”而不是“$$ case”吗?