触发更新其他表

时间:2015-08-18 22:52:11

标签: sql postgresql triggers sql-update plpgsql

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

这就是我设置触发器的方式。 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 个答案:

答案 0 :(得分:0)

有多个错误。请尝试改为:

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中对目标列进行表格限定是一种语法错误。

  • 除非您要取消INSERT / UPDATE,否则您需要return NEW in a BEFORE trigger
    您将其设为AFTER触发器,这也适用于此。

  • 您需要为当前行的NEW引用stream_id(在触发器功能中自动可见。

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

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

相关问题