3

我们如何将 Mysql 表视为有限的 FIFO 缓冲区(队列)。

目标是:

  1. 一次表只能有 N 行。
  2. 当插入一行时,应该删除最旧的行以保持行数为 N。

请提出方法。

更新: 对不起伙计们,正如许多人指出的那样,我将问题从 STACK 更改为 FIFO 队列

4

6 回答 6

4

过去的 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)
于 2012-04-04T19:17:33.433 回答
0

好吧,您当然可以在插入表时创建一个 AFTER 触发器,让它调用一个执行以下操作的存储过程:

delete from TableName where ID not in (select top N ID from TableName)
于 2012-04-04T19:18:59.823 回答
0

插入新内容时,堆栈不会删除以前的内容。

但是如果你真的需要这样的结构,那么Trigger为每个插入写一个之前。

于 2012-04-04T19:19:19.867 回答
0

你可以只计算你的桌子,如果它是 40 ;只需删除第一行,然后插入要插入的行。

get count 
if = 40
      delete
      insert
else
    insert
于 2012-04-04T19:16:27.607 回答
0

供参考

https://github.com/netkiller/mysql-fifo-plugin

这是mysql的fifo队列。

您可以将一些记录推送到 fifo 队列。或从 fifo 队列中提取记录。

:( 但它不是表格引擎。

于 2013-12-18T07:19:09.410 回答
0

只是在思考同样的 FIFO 问题,除了以 FIFO 方式处理固定数量的 COLUMNS,而不是行。但我认为我的解决方案适用于此,并且快速的 Google 搜索并没有为 MySQL 产生许多 FIFO 解决方案/示例。

这是我的基于列的方案:我的数据(data1、data2、data3 等)限制为 10 个可用列,如果我已经填满了所有 10 个列并且需要写入一条新数据,我想要覆盖最旧的数据。

我的解决方案:我添加了第 11 列来跟踪上次更新的列。因此,当需要写入新数据时,我的脚本可以查找最近更新的列,并使用一些简单的算术,回溯以确定 OLDEST 列,并将新数据插入该列(覆盖任何已经那里)。同时,我可以用我刚刚更新的列来更新“last_updated”列。

当然,您的问题专门针对行而不是列,但我不明白为什么我用于列的相同方法不适用于行...例如,您可以创建一个列来跟踪更新的最后一行. 您永远不会插入新行;只是覆盖现有的。

我不打算在数据库级别完全处理我的场景,但它似乎应该是可能的。

最后:这种方法确保您永远不会拥有超过 N 行/列的数据。许多触发方法似乎需要创建“额外”行,即使只是非常非常简短。

于 2013-05-17T03:55:05.070 回答