我认为像这样的东西(未测试)应该可以做到这一点,但是,正如@vadzimdvorak所说的,它可能需要对表的结构进行一些调整,因为它正在从调用触发器的同一个表中删除。 为了有一个完整的解决方案,该表应编辑如下: 表 mainTable 应该只包含 id , name , message 以及 date 字段,并且应该有第二个表( statusTable )只包含 mainId (a)提及 mainTable.id )以及 isSent 领域。 触发器应该是
DELIMITER //
CREATE TRIGGER delete_2_after_update
AFTER UPDATE
ON statusTable FOR EACH ROW
BEGIN
SLEEP(20);
DELETE FROM mainTable WHERE isSent = 2;
END; //
DELIMITER ;
4条答案
按热度按时间btxsgosb1#
您可以使用sql触发器,也可以在php中使用线程,如下所示:
xzlaal3s2#
我将添加一个额外的列,说明在某个点删除行的意图,datetime列名为
DeleteOn
例如,当我设置IsSent=2
. 然后我要么在DeleteOn
显示过去的日期或有一个单独的定期进程来清理它们。这样,每个查看该表的人都会知道,该表中有自动删除行的规则,他们可以查看这些行何时应该消失。
我更喜欢这个解决方案,而不是触发器,因为:
与触发器中的隐藏逻辑相比,明确的意图;
当数据发生神秘修改时,开发人员会忘记触发器的倾向(在我工作过的每个团队中都观察到这种现象);
由修改数据的触发器引起的无数个小时的调试问题(因为上面的一点)。
r8uurelv3#
你可以延迟执行
SELECT SLEEP(<seconds>);
,但不能删除触发器中被调用的行,所以我认为应该在sql之外处理它存储的函数或触发器不能修改已被调用该函数或触发器的语句(用于读取或写入)使用的表。https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html#stored-例程功能限制
xoshrz7s4#
我认为像这样的东西(未测试)应该可以做到这一点,但是,正如@vadzimdvorak所说的,它可能需要对表的结构进行一些调整,因为它正在从调用触发器的同一个表中删除。
为了有一个完整的解决方案,该表应编辑如下:
表
mainTable
应该只包含id
,name
,message
以及date
字段,并且应该有第二个表(statusTable
)只包含mainId
(a)提及mainTable.id
)以及isSent
领域。触发器应该是
请注意,此解决方案需要更改数据库的结构,这可能意味着程序中还有许多其他更改。