如何将Mysql表作为有限的FIFO缓冲区(队列)进行处理。
目标是:
- 每次只能在表中拥有N行。
- 当插入一行时,最旧的行应该被删除以保持行数为N。
请提供建议。
更新:对不起,各位,正如许多人指出的那样,我将我的问题从堆栈更改为FIFO队列。
如何将Mysql表作为有限的FIFO缓冲区(队列)进行处理。
目标是:
请提供建议。
更新:对不起,各位,正如许多人指出的那样,我将我的问题从堆栈更改为FIFO队列。
DELETE FROM foo WHERE id NOT IN (SELECT id FROM foo ORDER BY id DESC LIMIT 10)
你可以在表上创建一个AFTER插入触发器,让它调用一个存储过程来执行以下操作:
delete from TableName where ID not in (select top N ID from TableName)
刚刚在思考一个与FIFO问题有关的问题,不同之处在于以FIFO方式处理固定数量的列而不是行。但我认为我的解决方案也适用于这里,而且快速的谷歌搜索并没有找到很多MySQL的FIFO解决方案/示例。
这是我的基于列的情况:我只有10个可用的列来存储数据(data1、data2、data3等),如果我已经填满了所有10个列,并且需要写入新的数据,我希望覆盖最旧的数据。
我的解决方案:我添加了第11列来跟踪最后更新的列。因此,当需要写入新数据时,我的脚本可以查找最近更新的列,并通过一些简单的算术运算,回溯确定最旧的列,并将新数据插入该列(覆盖已经存在的任何内容)。同时,我可以更新“last_updated”列为我刚刚更新的列。
当然,你的问题特别涉及行而不是列,但我认为我用于列的相同方法也适用于行...例如,你可以创建一个列来跟踪最后更新的行。你永远不会插入新行,只会覆盖现有行。
我原本并不打算完全在数据库层面上处理我的情况,但似乎这是可能的。
最后:这种方法确保您永远不会有超过N行/列的数据。许多触发器方法似乎需要创建一个“额外”的行,即使只是非常短暂的时间。
供参考
https://github.com/netkiller/mysql-fifo-plugin
这是一个用于MySQL的FIFO队列。get count
if = 40
delete
insert
else
insert
当插入新内容时,堆栈不会删除先前的内容。
但是,如果您确实需要这样的结构,则为每个插入编写一个触发器
。