【问题标题】:mysql auto-increment - reassign after a record has been deletedmysql自动增量 - 删除记录后重新分配
【发布时间】:2012-07-08 03:11:21
【问题描述】:

我正在使用auto-increment 为数据库中的每个新条目分配一个ID。 另外,我有一个 php 脚本,它根据当前的页码从这个数据库中选择 10 个条目。 例如,如果当前页面为 2,则脚本应选择 id=20 和 id=29 之间的每个条目。

现在,如果我删除一个条目,ID 就会丢失。因此,当 id28 被删除时,脚本只会显示 9 个条目。

有没有办法在删除 e 记录后重新分配 auto-increment 值?

【问题讨论】:

  • 您是否有理由不使用 LIMIT 子句中的“偏移量”? LIMIT 0, 10,下一页LIMIT 10, 10,下一页LIMIT 20, 10,……
  • 我以前从未听说过这个。我想应该更好地研究整个 sql 的东西:o 非常感谢,这太棒了。

标签: php sql auto-increment


【解决方案1】:

您应该更改为页面选择条目的方式。

通过使用 LIMIT .. OFFSET 子句,您将能够选择 10 个条目,从第 N 个条目开始:

SELECT   *
FROM     table
ORDER BY id
LIMIT    10
OFFSET   19
  • LIMIT 10 表示只返回 10 行
  • OFFSET 19 表示返回第 19 行之后的行

这样,如果某些 id 已被删除并且 id 不是连续的,则无关紧要。

只需更改偏移量:

  • 第 1 页 => 偏移量 0
  • 第 2 页 => 偏移量 9
  • 第 3 页 => 偏移 19
  • 第 N 页 => 偏移量 (N-1)*10-1

【讨论】:

  • 应该是LIMIT 0, 10,因为这是一个从零开始的偏移量?
【解决方案2】:

这通常被认为是可取的:如果条目号 28 被删除,将永远不会再有条目 28。如果有人尝试引用它,他们显然是在尝试引用已删除的那个,您可以报告错误。

如果您返回并将28 重新分配给某个新条目,现在您不知道该人是指 28 还是 记录。

让我们退后一步,重新审视你想做的事情。您的目标不是在2030 之间显示十个条目。您的目标是显示十个符合您条件的条目。为此,您可以使用内置的 LIMITOFFSET 术语:

SELECT ...
FROM ...
WHERE ...
OFFSET 29
LIMIT 10

OFFSET 告诉 MySQL 从哪里开始计数,LIMIT 告诉它要计数多少。 MySQL 会将整个结果集放在一起,然后从第 30 个条目开始为您提供 10 个条目。这是您的第四页结果。现在他们碰巧拥有什么 ID 已经无关紧要了。

【讨论】:

    【解决方案3】:

    您的问题建议像这样的查询

    SELECT columns FROM table WHERE id BETWEEN 20 AND 29;
    

    或者不太优雅

    SELECT columns FROM table WHERE id >= 20 AND id <= 29;
    

    如果是这样,我建议您阅读LIMIT clause 并按照以下方式做一些事情

    SELECT columns FROM table ORDER BY id LIMIT 20, 10;
    

    【讨论】:

      【解决方案4】:

      你可以,但你不应该。如果 id=29 存在,是否将自增重设为 28,那么自增想使用 id=29 但记录已经存在时,就会出现问题。

      你最好写一个这样的查询:

      select * from table order by ID LIMIT n,10;
      

      其中n是页码*10

      【讨论】:

        【解决方案5】:

        重新分配自动增量值这是不好的做法,因为 id 可能与其他表相关。使用偏移/限制构造,忘记重新分配自动增量 :)

        【讨论】:

          【解决方案6】:

          作为对您的问题 (auto_increment) 的直接回答,您可以使用以下查询更改其值:

          ALTER TABLE `your_table` AUTO_INCREMENT = 200
          

          下一个创建的项目会将其下一个 AI 列值设置为 200。这在某些情况下很有用,尽管我同意您最好使用 LIMIT 偏移量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-13
            • 2013-10-04
            • 2012-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多