触发更新不同的表

Posted

技术标签:

【中文标题】触发更新不同的表【英文标题】:Trigger to update a different table 【发布时间】:2015-08-18 22:52:11 【问题描述】:

使用 Postgres 9.4,我有 2 个表 streamscomment_replies。我想做的是每次插入新的comment_replies 时更新streams.comments 计数,以跟踪特定流具有的cmets 数量。我没有收到任何错误,但是当我尝试创建新评论时,它会被忽略。

这就是我设置触发器的方式。 stream_id 是一个外键,所以每个stream_id 都会对应一个streams.id,它是streams 表的主键。我一直在看这个例子:Postgres trigger function,但一直无法让它工作。

CREATE TABLE comment_replies (
  id serial NOT NULL PRIMARY KEY,
  created_on timestamp without time zone,
  comments text,
  profile_id integer,
  stream_id integer
);

触发函数:

CREATE OR REPLACE FUNCTION "Comment_Updates"()
  RETURNS trigger AS
$BODY$BEGIN
  update streams set streams.comments=streams.comments+1
  where streams.id=comment_replies_streamid;

END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

还有触发器:

CREATE TRIGGER comment_add
  BEFORE INSERT OR UPDATE
  ON comment_replies
  FOR EACH ROW
  EXECUTE PROCEDURE "Comment_Updates"();

我该怎么做?

【问题讨论】:

【参考方案1】:

有多个错误。试试吧:

CREATE OR REPLACE FUNCTION comment_update()
  RETURNS trigger AS
$func$
BEGIN
   UPDATE streams s
   SET    streams.comments = s.comments + 1
-- SET    comments = COALESCE(s.comments, 0) + 1  -- if the column can be NULL
   WHERE  s.id = NEW.streamid;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql;
CREATE TRIGGER comment_add
BEFORE INSERT OR UPDATE ON comment_replies -- on UPDATE, too? Really?
FOR EACH ROW EXECUTE PROCEDURE comment_update();

如果可能,您还需要考虑DELETE。此外,如果UPDATE 可以更改stream_id。但是为什么增加每个UPDATE 的计数?这对我来说似乎是另一个错误。

SET clause of UPDATE中的目标列进行表限定是语法错误。

你需要return NEW in a BEFORE trigger,除非你想取消INSERT/UPDATE或者你把它改成@987654336 @trigger,这也适用。

当前行的stream_id需要引用NEW(在触发函数内部自动可见。

如果streams.comments 可以为NULL,请使用COALESCE

而是使用不带引号的合法小写标识符。

【讨论】:

非常感谢解决了我的问题,是的,我完全迷路了,它只会在插入时完成。

以上是关于触发更新不同的表的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 相同的触发器函数在 INSERT 上更新到不同的表(使用相同的模式)

更新触发器以将两个不同表中的数据添加到审计表中

Sql 触发器在表更新时添加新行

ORACLE PL/SQL 触发器使用两个不同的表

如何使用触发器从两个不同的表中插入数据

使用不同的表触发检查条件,然后根据结果更改插入行的值