首页 > 解决方案 > 使用触发器是更新计数或时间戳字段的好习惯吗?

问题描述

我有两个表(简化):

TABLE batch
batch_id      uuid
student_count smallint

TABLE students
batch_id    uuid
student_id  uuid

因此,每当将学生插入数据库时​​,我都想更新 student_count(add 1)。我的问题是我应该使用触发器来更新 student_count 还是使用单独的查询来更新 student_count。(我的数据库和服务器不在同一台机器上。)

我不能使用 before 触发器,因为插入可能会失败。(除非我使用了我在使用触发器时想要避免的事务。)

所以基本上是一个好习惯?

标签: sqldatabasepostgresqleventtrigger

解决方案


对于这样的任务,最好使用触发器,正是因为触发器保证运行,并且它自动运行在与触发语句相同的事务中。这是一件好事,因为这意味着要么两个操作都会成功,要么都失败(原子性),这正是您在这种情况下想要的。

然而,最好的解决方案可能根本不存储冗余student_count,而是在您SELECT从表中动态计算它。如果从性能的角度来看,在需要时计算它是无法容忍的,那么持久化冗余数据只是一个很好的解决方案。


推荐阅读