MySQL表作为FIFO/队列使用

3

如何将Mysql表作为有限的FIFO缓冲区(队列)进行处理。

目标是:

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

请提供建议。

更新:对不起,各位,正如许多人指出的那样,我将我的问题从堆栈更改为FIFO队列。


一个栈通常不会删除元素。但是一个有限的FIFO缓冲区可能会。你正在尝试表示哪种数据结构? - tadman
你可以使用存储过程或触发器来实现类似的功能。 - Brian Hoover
@tadman 抱歉,我错误地发布了我的问题。我确实正在寻找有限的FIFO或队列。请指正我。 - shashankaholic
6个回答

3

1
谢谢,我想这个BEFORE INSERT的SQL语句会完成工作。 - shashankaholic
1
我使用查询“/* SQL错误(1235):此版本的MySQL尚不支持'LIMIT&IN / ALL / ANY / SOME子查询'*/”时遇到了这个错误,有什么想法吗?“MySQL 5.5.16” - bman
我也尝试了BEFORE INSERT,但是出现了这个错误:“SQL错误(1442):无法在存储函数/触发器中更新表'tbl',因为它已被调用此存储函数/触发器的语句使用。” - bman
不能在触发器执行的同一张表上进行插入/更新/删除操作。 - user1658296

0

你可以在表上创建一个AFTER插入触发器,让它调用一个存储过程来执行以下操作:

delete from TableName where ID not in (select top N ID from TableName)

如果您使用BEFORE触发器,那么在插入之后会有N+1个,不是吗?我认为您需要一个AFTER触发器。 - itsmatt
但如果已经有N行,则插入后会变为N+1行。 - shashankaholic
1
如果重要的是表格中永远不要超过N行,那么将选择更改为“select top N-1 from TableName”,然后进行BEFORE触发器。然而,我认为既然有一个触发器会在插入之后立即执行,这并不重要——除非这是一项作业任务。按照现有的方式,使用AFTER触发器,像我写的那样,存储过程完成时表格中只会有N行。 - itsmatt
我同意,这确实无关紧要,因为最终结果是相同的。它可以是“BEFORE”和前N-1个或“AFTER”和前N个。但是,如果“BEFORE”确保计数不超过N,那就太好了。 - shashankaholic

0

刚刚在思考一个与FIFO问题有关的问题,不同之处在于以FIFO方式处理固定数量的列而不是行。但我认为我的解决方案也适用于这里,而且快速的谷歌搜索并没有找到很多MySQL的FIFO解决方案/示例。

这是我的基于列的情况:我只有10个可用的列来存储数据(data1、data2、data3等),如果我已经填满了所有10个列,并且需要写入新的数据,我希望覆盖最旧的数据。

我的解决方案:我添加了第11列来跟踪最后更新的列。因此,当需要写入新数据时,我的脚本可以查找最近更新的列,并通过一些简单的算术运算,回溯确定最旧的列,并将新数据插入该列(覆盖已经存在的任何内容)。同时,我可以更新“last_updated”列为我刚刚更新的列。

当然,你的问题特别涉及行而不是列,但我认为我用于列的相同方法也适用于行...例如,你可以创建一个列来跟踪最后更新的行。你永远不会插入新行,只会覆盖现有行。

我原本并不打算完全在数据库层面上处理我的情况,但似乎这是可能的。

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


0

0
你可以获取表格的行数,如果是40,就删除第一行,并插入你想要插入的行。
get count 
if = 40
      delete
      insert
else
    insert

是的,你说得对,但我正在寻找一种更动态的方法,可以在数据库中处理这个逻辑。 - shashankaholic
哦,触发器是你的机会了。 - kommradHomer

0

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

但是,如果您确实需要这样的结构,则为每个插入编写一个触发器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接