database - 在 SQLite 中处理过期记录删除的首选方法
问题描述
数据库中有 3 个表 - Students
, Courses
, Professors
. 每个学生都有activation_deadline
一列,NULL
在激活时设置为。我需要一些机制来定期删除过期的学生activation_deadline
(并防止已经“过期”的学生被激活)。
目前,我通过三个单独的触发器(因为SQLite 中没有数据库或服务器级触发器)来执行Students
表。
一个用于UPDATE
:
CREATE TRIGGER Remove_Unactivated_Students_Update
BEFORE UPDATE
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
一个用于INSERT
:
CREATE TRIGGER Remove_Unactivated_Students_Insert
BEFORE INSERT
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
一个用于DELETE
:
CREATE TRIGGER Remove_Unactivated_Students_Delete
AFTER DELETE
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
另一种方法是向后端添加一些代码,这将在执行任何其他对数据库的查询之前检查并删除过期记录(尽管这会增加数据库调用的数量,这并不好)。
在这种情况下,首选哪种(保留“过期”记录删除数据库触发器或后端中的逻辑)方法,为什么?各自的优缺点是什么?
解决方案
SQLite 是一个无服务器 DBMS,您不能定义/安排任务或作业。
应在应用程序级别处理您的要求,您可以在其中定义每日或每周工作以删除过期学生。
这仅涉及DELETE
每天/每周执行一次非常简单且快速的语句:
DELETE FROM Students WHERE activation_deadline <= strftime('%s', 'now');
请注意,条件activation_deadline IS NOT NULL
由 覆盖activation_deadline <= strftime('%s', 'now')
,因此不需要。
任何涉及多个触发器的解决方案都是不可能的,因为它会给表上的任何简单//操作增加不必要INSERT
的开销DELETE
。UPDATE
推荐阅读
- typescript - 将部分字段列表从类传递给方法
- python - 如何从数据框中删除方括号
- java - 使用 JMS 将 AMQ 替换为 SQS,但 Message 对象中的某些属性值为 null
- python - 使用 PIP 安装包时出现问题(可能是由于两个 Python 版本)
- openedge - 使用 MATCHES 进行动态查询 4GL
- python - 是否可以在 __post_init__() 或更高版本中冻结数据类对象?
- html - 打印页码 WordPress 网站
- php - 从另一个数组中获取关联数组的键
- python - 如何从数字 452.91zero 中删除零并转换为浮点数
- javascript - 如何获取此 json 中的文件名?