使用Postgres 9.4,我有2个表streams
和comment_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"();
我该怎么做?
答案 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
。
而是使用不带引号,合法的小写标识符。