功能用于自动将一个表中对应的记录数设置为第二个表中的默认值



我有点困在这里了。我会尽量保持简单。

我有两张桌子。

产品
  1. (product_id, number_of_reviews,…)
  2. 评论(main_product_id, review,…)

main_product_id是引用Products表product_id的外键。

我需要number_of_reviews列应该自动更新为reviews表中显示的product_id的评论数。可以通过比较product_idmain_product_id进行匹配。

我知道我可以使用count来获取评论的数量,使用下面的sql语句:

SELECT COUNT(*) FROM reviews WHERE main_product_id = 'exampleid1'

这里的exampleid1应该是products表中的product_id。

但是我如何创建我可以在列number_of_reviews中调用DEFAULT的函数?函数,该函数自动从当前行获取product_id并将其传递给select语句并返回评论数…

我被困在这里好几个小时了,我找了很多遍还是不明白。

这是我第一次在stackoverflow上提问,也是我第一次对编码产生兴趣。具体的PERN堆栈。(我不喜欢代码超过6年,但现在我终于建立了一些兴趣)

首先,这实际上是一个糟糕的计划,您正在保存一个可以轻松计算的值。然而,它似乎很常见,尽管它经常导致并发症。功能你需要的是一个trigger;更具体地说,是一个触发函数和reviews上的触发。(见演示)

create or replace function record_a_review_air()
returns trigger 
language plpgsql 
as $$
begin 
update products 
set reviews = reviews+1
where prod_id = new.prod_id;
return new;
end;
$$;
create trigger reviews_air
after insert 
on reviews
for each row 
execute function record_a_review_air();

注意:设置一个默认不会完成你想要的。这样做将在插入Product时设置a值。但是不会再为该Product调用。

这是为我工作-感谢@belayer提供的演示和代码

create or replace function record_a_review_air()
returns trigger 
language plpgsql 
as $$
begin 
update products 
set n_reviews = (SELECT COUNT(*) FROM reviews WHERE main_prod_id = prod_id)
where prod_id = coalesce(new.main_prod_id, old.main_prod_id);
return new;
end;
$$;
create trigger reviews_air
after insert or delete or update of rev_id, main_prod_id, review
on reviews
for each row 
execute function record_a_review_air(); 

(我更新了答案,以添加适合我的事件(插入,更新,删除)的新代码)

最新更新