我的表:
我想要的是当isSent
更新为“2”然后在20秒后删除整行时,这可能吗?
(它的标准值是1但是当消息发送时它变为2)
答案 0 :(得分:1)
我认为这样的事情(未经测试)应该可以解决问题但是,正如@VadzimDvorak所说,它可能需要对表结构进行一些调整,因为它是从调用触发器的同一个表中删除的。
为了获得完整的解决方案,该表应编辑如下:
表mainTable
应仅包含id
,name
,message
和date
字段,并且应该有第二个表({{1} })仅包含statusTable
(对mainId
的引用)和mainTable.id
字段。
然后触发器应
isSent
请请注意,此解决方案需要更改数据库的结构,这可能意味着您的程序中有许多其他更改。
答案 1 :(得分:0)
您可以使用SELECT SLEEP(<seconds>);
延迟执行,但是您无法删除触发器中的调用行,所以我认为它应该在sql之外处理
存储的函数或触发器无法修改已经存在的表 被调用的语句用于(读或写) 功能或触发器。 https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html#stored-routines-function-restrictions
答案 2 :(得分:0)
您可以使用SQL TRIGGER或PHP中的线程执行此操作:
class My_Thread extends Thread
{
public function run() {
sleep(20);
//DELETE
}
}
$t = new My_Thread();
$t->start();
答案 3 :(得分:0)
我会添加一个额外的列来说明在某个时候删除行的意图,例如名为DeleteOn
的日期时间列,并且当我设置IsSent=2
时我会设置值。然后我会过滤DeleteOn
显示过去日期的行,或者有一个单独的定期过程来清理它们。
这样每个看表的人都会知道这个表有规则可以自动删除行,他们可以查看这些行何时消失。
由于以下原因,我更喜欢使用触发器解决方案: