您可以通过 triggers 实现这一目标。
如果您这样做,请务必适当地涵盖所有类型的写访问。 INSERT, UPDATE, DELETE.
另请注意,Table 2 上的 TRUNCATE 或 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)
如果您使用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!