更新列时删除mysql行

falq053o  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(293)

我的table:
身份证件
名称
消息
日期
伊森特
我想要的是什么时候 isSent 更新为“2”,20秒后删除整行,可以吗(它的标准值是1,但当发送消息时,它将更改为2)

btxsgosb

btxsgosb1#

您可以使用sql触发器,也可以在php中使用线程,如下所示:

class My_Thread extends Thread
{

  public function run() {
    sleep(20);
    //DELETE
  }

}

$t = new My_Thread();
$t->start();
xzlaal3s

xzlaal3s2#

我将添加一个额外的列,说明在某个点删除行的意图,datetime列名为 DeleteOn 例如,当我设置 IsSent=2 . 然后我要么在 DeleteOn 显示过去的日期或有一个单独的定期进程来清理它们。
这样,每个查看该表的人都会知道,该表中有自动删除行的规则,他们可以查看这些行何时应该消失。
我更喜欢这个解决方案,而不是触发器,因为:
与触发器中的隐藏逻辑相比,明确的意图;
当数据发生神秘修改时,开发人员会忘记触发器的倾向(在我工作过的每个团队中都观察到这种现象);
由修改数据的触发器引起的无数个小时的调试问题(因为上面的一点)。

r8uurelv

r8uurelv3#

你可以延迟执行 SELECT SLEEP(<seconds>); ,但不能删除触发器中被调用的行,所以我认为应该在sql之外处理它
存储的函数或触发器不能修改已被调用该函数或触发器的语句(用于读取或写入)使用的表。https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html#stored-例程功能限制

xoshrz7s

xoshrz7s4#

我认为像这样的东西(未测试)应该可以做到这一点,但是,正如@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 ;

请注意,此解决方案需要更改数据库的结构,这可能意味着程序中还有许多其他更改。

相关问题