2009-01-26 46 views
0

我有两个表格(在postgres中) - 广告和日志。在每次插入日志表后,根据操作,它应该增加广告表中列的数量。在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 
      ^

更新: @Tomalak:谢谢你的功能和更新的更新语句(无法抗拒的双关语)。

我学会了大量的谷歌搜索,该函数不应该有任何参数,并使用NEW.col_name,并应返回一个TRIGGER。

+0

我不确定返回触发器的函数是什么。在我的理解中,触发器是被定义的,而不是由函数返回的,但是我对postgres的了解并不多,所以我很高兴至少得到UPDATE语句。 ;-) – Tomalak 2009-01-26 19:18:08

+0

谨慎地更新我的答案与您的发现,所以通过谷歌来到这里的其他人发现他们可以立即使用的东西? – Tomalak 2009-01-26 19:18:49

回答

2

首先,你的更新调用应该是:

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; 

情况下不流控制语句,它不能是像IF语句一样使用。它是一种产生价值的声明(表达),并且必须如此使用,例如,你必须从中选择/更新。

0

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