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

更新另一个表中计数的PostgreSQL触发器,sql,postgresql,triggers,sql-update,sql-function,Sql,Postgresql,Triggers,Sql Update,Sql Function,我是PostgreSQL的新手,我真的被一项看似简单的任务困住了。我有一张有音乐专辑的桌子和一张有乐队特色的桌子,包括在一个特定的时间,比如说在1990年到1995年,乐队发行了多少张专辑。因此,我需要创建一个触发器,每当我插入、删除或更新albums表时,它都会更新bands选项卡。 以下是表格: Album id_album id_band year 1 1 1995 2 1 1985 3

我是PostgreSQL的新手,我真的被一项看似简单的任务困住了。我有一张有音乐专辑的桌子和一张有乐队特色的桌子,包括在一个特定的时间,比如说在1990年到1995年,乐队发行了多少张专辑。因此,我需要创建一个触发器,每当我插入、删除或更新albums表时,它都会更新bands选项卡。 以下是表格:

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)

非常感谢,@GMB。我将尝试它,并让你知道它是否有效!一般来说,储存骨料是个坏主意。