触发更新不同的 table

Trigger to update a different table

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

这就是我设置触发器的方式。 stream_id是外键,所以每个stream_id都会对应一个streams.id,也就是streamstable的主键。我一直在看这个例子: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"();

我该怎么做?

有多个错误。试试看:

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

   <b>RETURN NEW;</b>
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的计数?这对我来说似乎是另一个错误。

  • 语法错误 table-限定 SET clause of UPDATE 中的目标列。

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

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

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

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