首页 > 解决方案 > 在 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;

另一种方法是向后端添加一些代码,这将在执行任何其他对数据库的查询之前检查并删除过期记录(尽管这会增加数据库调用的数量,这并不好)。

在这种情况下,首选哪种(保留“过期”记录删除数据库触发器或后端中的逻辑)方法,为什么?各自的优缺点是什么?

标签: databasesqlitetriggersbackendexpirationhandler

解决方案


SQLite 是一个无服务器 DBMS,您不能定义/安排任务或作业。

应在应用程序级别处理您的要求,您可以在其中定义每日或每周工作以删除过期学生。

这仅涉及DELETE每天/每周执行一次非常简单且快速的语句:

DELETE FROM Students WHERE activation_deadline <= strftime('%s', 'now');

请注意,条件activation_deadline IS NOT NULL由 覆盖activation_deadline <= strftime('%s', 'now'),因此不需要。

任何涉及多个触发器的解决方案都是不可能的,因为它会给表上的任何简单//操作增加不必要INSERT的开销DELETEUPDATE


推荐阅读