【发布时间】:2023-03-05 14:44:01
【问题描述】:
-
有
users表和places表。 -
users表有列id(主键)、username、place_count。 -
places表有列id(主键)、name、user_id(用户 ID 外键) -
每个用户都可以发布多张照片,所以我想要 列“place_count”以保留用户特定位置的计数 地点表(例如,具有 id 1 的用户具有 place_count = 150,具有 id 2 具有 place_count = 244 等)。
我使用了触发器
触发功能
CREATE FUNCTION log_place_count_update_to_user()
RETURNS TRIGGER as $$
BEGIN
IF (TG_OP = `INSERT`) THEN
UPDATE users
SET place_count = place_count + 1
WHERE user_id;
ELSEIF (TG_OP = `DELETE`) THEN
UPDATE users
SET place_count = place_count - 1
WHERE id = NEW.user_id AND place_count > 0;
END IF;
RETURN NEW;
END
$$
LANGUAGE PLPGSQL;
触发器创建
CREATE TRIGGER log_place_count_update
AFTER INSERT OR DELETE
ON places
FOR EACH ROW
EXECUTE PROCEDURE log_place_count_update_to_user();
我在users 表中插入了一些用户,初始值为place_count = 0。
问题:当我使用名称和 user_id 更新地点时,我希望触发器将 users 表中的 place_count 增加 1。但是place_count 的user 表中没有发生任何增量。
我做错了什么?
【问题讨论】:
-
不要实现计数。删除
users中的列place_count和触发器。冗余数据可能导致不一致。您始终可以查询 right 值。为方便起见,您可以创建一个视图,列出用户和计数。 -
我现在不知道视图。刚从 postgres 开始。但是感谢您提出来,我当然会查看视图并查看它可以解决我想要的功能的地方。在我的方法的背景下,为什么会出错?
标签: sql postgresql triggers