sql - 使用触发器是更新计数或时间戳字段的好习惯吗?
问题描述
我有两个表(简化):
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 触发器,因为插入可能会失败。(除非我使用了我在使用触发器时想要避免的事务。)
所以基本上这是一个好习惯?
解决方案
对于这样的任务,最好使用触发器,正是因为触发器保证运行,并且它自动运行在与触发语句相同的事务中。这是一件好事,因为这意味着要么两个操作都会成功,要么都失败(原子性),这正是您在这种情况下想要的。
然而,最好的解决方案可能根本不存储冗余student_count
,而是在您SELECT
从表中动态计算它。如果从性能的角度来看,在需要时计算它是无法容忍的,那么持久化冗余数据只是一个很好的解决方案。
推荐阅读
- python - 映射在 Elasticsearch 中究竟做了什么?
- excel - 将日期时间从 .xlsx 导入 .accdb
- android - android从Json url获取字符串
- java - Runtime.getRuntime().exec() 在 Java 程序中通过 file.sql 创建数据库
- javascript - 在数据表中的导出 excel 上保留小数分隔符
- python - 会话属性 [AWS Lambda / Amazon Alexa Skill]
- c# - 我们可以将数据添加到具有相同分区键和相同行键的表存储中吗
- node.js - ResourceNotFoundException:给定的活动不存在 AWS Personalize
- emacs - 组织模式扩展来为预定的条目/子树着色?
- typo3 - TYPO3 cms-indexed-search 核心扩展缺少 RouteEnhancer?