【问题标题】:Trigger to update a column during insert in postgres在 postgres 中插入期间触发更新列
【发布时间】:2010-10-03 14:03:00
【问题描述】:

我有两个表(在 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。

【问题讨论】:

  • 我不确定返回触发器的函数是什么。在我的理解中,触发器是定义的,而不是由函数返回的,但是我又不太了解 postgres,所以我很高兴我至少得到了正确的 UPDATE 语句。 ;-)
  • 想用您的发现更新我的答案,以便其他通过 Google 来到这里的人找到他们可以立即使用的东西吗?
  • @Tomalak,如果您想了解有关伪类型 TRIGGER 的更多信息,请参阅postgresql.org/docs/8.3/interactive/trigger-definition.html 如果您仍想了解更多信息,您可以提出一个新的 SO 问题,我将在那里提供详细的答案。
  • 哦该死的,你还不能编辑其他人的帖子(对不起,我忘了)。不过,您可以将工作示例编辑成您自己的问题。

标签: postgresql triggers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 多余的空间不起作用。我认为 $$ 只是 quote '.它可以在没有任何空间的情况下使用。
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2015-11-06
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多