在另一个 table 中更新计数的 PostgreSQL 触发器
PostgreSQL trigger which updates count in another table
我是 PostgreSQL 的新手,我真的被一个看似简单的任务困住了。我有一个带有音乐专辑的 table 和一个带有乐队功能的 table,包括这样的乐队在特定时间发行了多少张专辑,比如 1990 年到 1995 年之间。所以我需要创建一个触发器来保持每当我插入、删除或更新专辑 table 时,乐队就会更新。
这些是 table:
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 --^--
虽然这在技术上可行,但它仍然相当低效,因为它会在仅修改一行时重置整个 table。您可以使用 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)
我是 PostgreSQL 的新手,我真的被一个看似简单的任务困住了。我有一个带有音乐专辑的 table 和一个带有乐队功能的 table,包括这样的乐队在特定时间发行了多少张专辑,比如 1990 年到 1995 年之间。所以我需要创建一个触发器来保持每当我插入、删除或更新专辑 table 时,乐队就会更新。 这些是 table:
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 --^--
虽然这在技术上可行,但它仍然相当低效,因为它会在仅修改一行时重置整个 table。您可以使用 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)