触发更新不同的 table
Trigger to update a different table
使用 Postgres 9.4,我有 2 tables streams
和 comment_replies
。我正在尝试做的是在每次插入新的 comment_replies
时更新 streams.comments
计数,以跟踪特定流的评论数。我没有收到任何错误,但是当我尝试创建新评论时,它被忽略了。
这就是我设置触发器的方式。 stream_id
是外键,所以每个stream_id
都会对应一个streams.id
,也就是streams
table的主键。我一直在看这个例子: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
。
而是使用不带引号的合法小写标识符。
使用 Postgres 9.4,我有 2 tables streams
和 comment_replies
。我正在尝试做的是在每次插入新的 comment_replies
时更新 streams.comments
计数,以跟踪特定流的评论数。我没有收到任何错误,但是当我尝试创建新评论时,它被忽略了。
这就是我设置触发器的方式。 stream_id
是外键,所以每个stream_id
都会对应一个streams.id
,也就是streams
table的主键。我一直在看这个例子: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 ofUPDATE
中的目标列。除非您想取消
INSERT
/UPDATE
,否则您需要returnNEW
in aBEFORE
trigger。
或者你把它设为AFTER
触发器,这也适用于此。您需要为当前行的
stream_id
引用NEW
(在触发器函数中自动可见。如果
streams.comments
可以为NULL,则使用COALESCE
。
而是使用不带引号的合法小写标识符。