繁体   English   中英

PostgreSQL 触发器更新另一个表中的计数

[英]PostgreSQL trigger which updates count in another table

我对 PostgreSQL 比较陌生,而且我真的被一个看似简单的任务困住了。 我有一张带有音乐专辑的表格和一张带有乐队功能的表格,包括在特定时间发布了多少张这样的乐队专辑,比如说在 1990 年和 1995 年之间。所以我需要创建一个触发器,在我插入时保持乐队表格更新,删除或更新相册表。 这些是表:

Album

id_album   id_band    year
1          1          1995
2          1          1985
3          2          1993
4          3          1998


Band

id_band   num_albums9095
1         1 
2         1 
3         0 

所以我创建了以下函数和触发器:

CREATE FUNCTION update_num_nineties()
RETURNS trigger AS $$ BEGIN
UPDATE band
SET num_albums_eighties = (SELECT COUNT (*) FROM album
where album.year between 1990 and 1995
GROUP BY album.id_band);
END;
$$LANGUAGE plpgsql;

CREATE TRIGGER update_nineties_album_mod_album AFTER UPDATE ON album FOR EACH row EXECUTE PROCEDURE update_num_nineties();

但是,每当我尝试更新任何值来测试它时,我都会得到一个用作表达式子查询,返回多条行消息 有没有人能帮我看看为什么我走错了方向?

您需要将子查询与外部查询相关联

update band b
set num_albums_eighties = (
    select count (*) 
    from album a
    where a.year between 1990 and 1995 and a.id_band = b.id_band
)                                        --^-- correlation --^--

虽然这在技术上可行,但它仍然相当低效,因为当只修改一行时它会重置整个表。 您可以使用where子句限制行:

update band b
set num_albums_eighties = (
    select count (*) 
    from album a
    where a.year between 1990 and 1995 and a.id_band = b.id_band
)
where b.id_band in (old.band_id, new.band_id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM