MySQL触发器。如何在有限的时间内将每行数据存储在表中?

时间:2014-06-18 10:38:49

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

我的数据库中有一个表,每行应存储一段有限的时间(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.

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

1 个答案:

答案 0 :(得分:1)

一般情况下,您不想在触发器中执行sleep。那只是锁定了桌子。

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

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

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

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