更新列时删除mysql行

时间:2018-01-16 09:30:51

标签: mysql

我的表:

  • ID
  • 名称
  • 消息
  • 日期
  • isSent

我想要的是当isSent更新为“2”然后在20秒后删除整行时,这可能吗? (它的标准值是1但是当消息发送时它变为2)

4 个答案:

答案 0 :(得分:1)

我认为这样的事情(未经测试)应该可以解决问题但是,正如@VadzimDvorak所说,它可能需要对表结构进行一些调整,因为它是从调用触发器的同一个表中删除的。

为了获得完整的解决方案,该表应编辑如下:

mainTable应仅包含idnamemessagedate字段,并且应该有第二个表({{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显示过去日期的行,或者有一个单独的定期过程来清理它们。

这样每个看表的人都会知道这个表有规则可以自动删除行,他们可以查看这些行何时消失。

由于以下原因,我更喜欢使用触发器解决方案:

  • 与触发器中隐藏逻辑相比的显式意图;
  • 当数据发生神秘的修改时,开发人员忘记触发器的倾向(在我参与过的每个团队中观察到这种情况);
  • 无数小时的头痛调试由修改数据的触发器引起的问题(由于上述观点)。