我们如何将 Mysql 表视为有限的 FIFO 缓冲区(队列)。
目标是:
- 一次表只能有 N 行。
- 当插入一行时,应该删除最旧的行以保持行数为 N。
请提出方法。
更新: 对不起伙计们,正如许多人指出的那样,我将问题从 STACK 更改为 FIFO 队列
过去的 Mysql 5 你可以使用触发器来实现这一点。
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
那么您触发的 sql 将与以下内容一致:
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)
插入新内容时,堆栈不会删除以前的内容。
但是如果你真的需要这样的结构,那么Trigger
为每个插入写一个之前。
你可以只计算你的桌子,如果它是 40 ;只需删除第一行,然后插入要插入的行。
get count
if = 40
delete
insert
else
insert
供参考
https://github.com/netkiller/mysql-fifo-plugin
这是mysql的fifo队列。
您可以将一些记录推送到 fifo 队列。或从 fifo 队列中提取记录。
:( 但它不是表格引擎。
只是在思考同样的 FIFO 问题,除了以 FIFO 方式处理固定数量的 COLUMNS,而不是行。但我认为我的解决方案适用于此,并且快速的 Google 搜索并没有为 MySQL 产生许多 FIFO 解决方案/示例。
这是我的基于列的方案:我的数据(data1、data2、data3 等)限制为 10 个可用列,如果我已经填满了所有 10 个列并且需要写入一条新数据,我想要覆盖最旧的数据。
我的解决方案:我添加了第 11 列来跟踪上次更新的列。因此,当需要写入新数据时,我的脚本可以查找最近更新的列,并使用一些简单的算术,回溯以确定 OLDEST 列,并将新数据插入该列(覆盖任何已经那里)。同时,我可以用我刚刚更新的列来更新“last_updated”列。
当然,您的问题专门针对行而不是列,但我不明白为什么我用于列的相同方法不适用于行...例如,您可以创建一个列来跟踪更新的最后一行. 您永远不会插入新行;只是覆盖现有的。
我不打算在数据库级别完全处理我的场景,但它似乎应该是可能的。
最后:这种方法确保您永远不会拥有超过 N 行/列的数据。许多触发方法似乎需要创建“额外”行,即使只是非常非常简短。