sql - 在另一个表中更新计数的 PostgreSQL 触发器
问题描述
我对 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)
推荐阅读
- c - C - 对附有名称的数字进行排序
- javascript - 使用路由或查询更改 vuetify 选项卡
- asp.net-core - Wsfederation 错误。令牌过期后,注册用户的注册表单不断弹出
- java - 使用 Android Studio,为什么包含在 LinearLayout 小部件中的 TextView 显示被截断?
- react-native - React Native:文本字符串必须在
零件 - javascript - 如何抽象现有的 firebase CRUD 操作,以便能够迁移到 node.js 中的另一个数据库
- amazon-s3 - 如何列出存储桶中所有对象的版本及其各自的元数据 (x-amz-meta-version)
- django - Django查询集过滤器基于父级的父级
- c++ - 我的 c++ 程序没有输入就终止了。我该怎么办?
- c# - 我的数据库项目的gridview和更新仍然有问题