【问题标题】:MySQL trigger. How to store each row of data in table for a limited time?MySQL 触发器。如何在有限的时间内将每一行数据存储在表中?
【发布时间】:2014-06-18 10:38:49
【问题描述】:

我的数据库中有一个表,其中的每一行都应存储有限的时间(1 分钟)。我正在尝试像这样执行 ON INSERT 触发器:

CREATE TRIGGER `temp_data_trig` AFTER INSERT ON `tokens`
FOR EACH ROW 
BEGIN
    DO SLEEP(60);
    DELETE FROM `tokens` WHERE id = NEW.id;
END

但是当我尝试插入新行时,我得到了这个:

Can't update table 'tokens' in stored function/trigger because it is 
already used by statement which invoked this stored function/trigger.

我的触发器出了什么问题,在有限的时间内存储每行数据的正确方法是什么?

【问题讨论】:

    标签: mysql sql triggers sql-insert sql-delete


    【解决方案1】:

    一般来说,您不想在触发器中执行sleep。这只是锁定了表。

    我建议您采取以下方法之一。

    第一个是在插入内容时包含日期/时间戳。然后有一项工作会删除超过一分钟的记录。请注意,这会给数据库带来相当大的负载。或者,您可以保留所有记录,随意插入它们,并拥有一个选择在最后一分钟创建的记录的视图:

    create view v_table
        select *
        from table
        where createdat >= now() - interval 1 minute;
    

    最终的解决方案是按分钟间隔对数据进行分区。然后,您可以删除对数据库性能影响最小的分区(“最小”相对于可能锁定表较长时间的其他选项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多