【问题标题】:MySQL table as a FIFO/QueueMySQL 表作为 FIFO/队列
【发布时间】:2016-07-01 21:33:02
【问题描述】:

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

目标是:

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

请建议方法。

更新: 抱歉,正如许多人指出的那样,我将问题从 STACK 更改为 FIFO 队列

【问题讨论】:

  • 堆栈一般不会删除东西。不过,有限的 FIFO 缓冲区可能会。你想表达什么样的数据结构?
  • 你可以用存储过程或(我认为)触发器来做这样的事情
  • @tadman 对不起,我错误地提出了我的问题。当然,我正在寻找有限的 FIFO 或队列。纠正我。

标签: mysql stack queue fifo


【解决方案1】:

过去的 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)

【讨论】:

  • 谢谢,我猜 BEFORE INSERT 上的这个 sql 可以完成这项工作。
  • 我使用查询 /* SQL Error (1235): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' */ 得到这个错误有什么想法吗? MySQL 5.5.16
  • 我也尝试了 BEFORE INSERT 我收到此错误SQL Error (1442): Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this stored function/trigger
  • 您不能在触发器正在执行的同一个表上执行插入/更新/删除。
【解决方案2】:

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

get count 
if = 40
      delete
      insert
else
    insert

【讨论】:

  • 是的,你是对的,但我正在寻找一种更动态的方法,这种逻辑可以在 DB 中处理。
  • 哦。触发器是你的镜头然后是的
【解决方案3】:

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

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

【讨论】:

  • 如果你做一个 BEFORE 触发器,它会在插入之后有 N+1,不是吗?我相信你会想要一个 AFTER 触发器。
  • 但如果已经有 N 行,AFTER insert 会达到 N+1。
  • 如果您从不表中的行数超过 N 行至关重要,则将选择更改为“从 TableName 中选择前 N-1 行)并执行 BEFORE 触发器然后。我会争辩说,但是,因为有一个触发器将在插入后立即执行,所以这真的没关系 - 除非这是一个家庭作业。正如所写的那样,使用 AFTER 触发器类似于我当存储过程完成时,写入将导致表中只有 N 行。
  • 我同意,这真的没关系,因为最终结果是一样的。它可以是 BEFORE 和 top N-1 或 AFTER 和 top N。但是,如果 BEFORE 确保计数不超过 N,那就完美了。
【解决方案4】:

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

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

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

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

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

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

【讨论】:

    【解决方案5】:

    仅供参考

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

    这是一个mysql的fifo队列。

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

    :(但它不是表格引擎。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-12
        • 2019-04-11
        • 1970-01-01
        • 2023-04-06
        • 2017-04-08
        • 1970-01-01
        • 2023-04-03
        相关资源
        最近更新 更多