我目前有两张桌子:
Table 1
具有唯一的 ID 和计数。
Table 2
有一些数据列和一列,其中唯一 ID 的值Table 1
在里面。
当我在 中插入一行数据时Table 2
,具有引用的唯一 id 的行的计数Table 1
应该增加。
希望我说清楚了。总的来说,我对 PostgreSQL 和 SQL 非常陌生,所以我将不胜感激如何做到这一点。=)
我目前有两张桌子:
Table 1
具有唯一的 ID 和计数。
Table 2
有一些数据列和一列,其中唯一 ID 的值Table 1
在里面。
当我在 中插入一行数据时Table 2
,具有引用的唯一 id 的行的计数Table 1
应该增加。
希望我说清楚了。总的来说,我对 PostgreSQL 和 SQL 非常陌生,所以我将不胜感激如何做到这一点。=)
您可以使用triggers来实现。
如果您这样做,请确保适当地涵盖所有类型的写访问。INSERT
, UPDATE
, DELETE
.
另请注意,TRUNCATE
打开Table 2
或手动编辑Table 1
可能会破坏数据完整性。
我建议您考虑VIEW
改为返回自动更新的聚合结果。像:
CREATE VIEW tbl1_plus_ct AS
SELECT t1.*, t2.ct
FROM tbl1 t1
LEFT JOIN (
SELECT tbl1_id, count(*) AS ct
FROM tbl2
GROUP BY 1
) t2 USING (tbl1_id)
如果您使用 a LEFT JOIN
,则包含 的所有行tbl1
,即使 中没有引用也是如此tbl2
。使用常规JOIN
,这些行将从VIEW
.
对于表的全部或大部分,tbl2
首先在子查询中聚合,然后加入到tbl1
- 就像上面演示的那样,是最快的。
除了创建视图之外,您还可以直接使用查询,如果您只获取一行或几行,这种替代形式会表现得更好:
SELECT t1.*, count(t2.tbl1_id) AS ct
FROM tbl1 t1
LEFT JOIN tbl2 t2 USING (tbl1_id)
WHERE t1.tbl1_id = 123 -- for example
GROUP BY t1.tbl1_id -- being the primary key of tbl1!