【问题标题】:Limiting table size in mysql, and removing row #1 when new row (above limit) is inserted限制 mysql 中的表大小,并在插入新行(超过限制)时删除第 1 行
【发布时间】:2015-04-04 19:39:20
【问题描述】:

我已经搜索过这个问题的答案,但还没有找到。如果它已经在某个地方得到回答,我深表歉意。

这是我的情况:

我的 MySQL 数据库中有一个表,我想限制为 150 行。如果在达到限制后插入新行,我想删除第 1 行,然后插入新行。

我正在使用 PHP 和 PDO,如果这很重要的话。

我觉得这是一个简单的问题,如果这完全是菜鸟,我深表歉意。我对此比较陌生,我只是在努力学习。

谁能指出我正确的方向,或者解释一下我将用于这样的事情的语法?

提前感谢您的宝贵时间!

【问题讨论】:

    标签: php mysql pdo insert limit


    【解决方案1】:

    您可以计算表格中的行数:

    SELECT COUNT(*) FROM <table>
    

    然后,如果该数量已达到您的限制,您可以删除一行:

    DELETE FROM <table> ORDER BY <column> LIMIT 1;
    

    最后你添加了你的新行。

    是的,这是三个步骤,这就是 MySQL 的工作原理。

    当多个用户访问表时,这可能会变成梨形,更好地使用事务并锁定表。

    我认为需要另一种方法。这不是您应该对数据库执行的操作。更好的解决方案是在检索行时限制行数:

    SELECT * FROM <table> ORDER BY <column> LIMIT 150
    

    这样您只能检索 150 行,这也应该可以解决您的问题。在代码中的某处添加一个无害的 DELETE,如下所示:

    SELECT COUNT(*) FROM <table>
    DELETE FROM <table> ORDER BY <column> LIMIT <count-200>;
    

    或任何变体...基本上删除过时的行。

    【讨论】:

    • 我认为这正是我想要的。谢谢!几分钟后我会在这里试一试,看看我能不能让它工作。再次感谢您的宝贵时间!
    • 你可以把上面的代码放在一个触发器中,这样在执行插入时它会自动执行。
    • @Norbert:是的,你可以,但你解决问题的方法不对。为什么不限制检索行的时间?
    • 我已经添加了您指定的删除语句:DELETE FROM &lt;table&gt; ORDER BY &lt;column&gt; LIMIT &lt;count-200&gt;; 编辑——它实际上似乎没有删除任何行。我一定是某处出错了
    • '' 中的 'count' 应该来自它上面的 SELECT,使用 PHP。你可能还需要ORDER BY &lt;column&gt; DESC,所以按相反的顺序。对不起,那段代码有点神秘。这基本上意味着您需要删除明显太旧且永远不会使用的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多