触发更新不同的表
Posted
技术标签:
【中文标题】触发更新不同的表【英文标题】:Trigger to update a different table 【发布时间】:2015-08-18 22:52:11 【问题描述】:使用 Postgres 9.4,我有 2 个表 streams
和 comment_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
。
而是使用不带引号的合法小写标识符。
【讨论】:
非常感谢解决了我的问题,是的,我完全迷路了,它只会在插入时完成。以上是关于触发更新不同的表的主要内容,如果未能解决你的问题,请参考以下文章