1

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

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

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

4

6 回答 6

5

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

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

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

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

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

于 2012-07-08T11:51:12.993 回答
3

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

通过使用 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
于 2012-07-08T11:50:43.337 回答
1

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

SELECT columns FROM table WHERE id BETWEEN 20 AND 29;

或不那么优雅

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

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

SELECT columns FROM table ORDER BY id LIMIT 20, 10;
于 2012-07-08T11:51:41.917 回答
1

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

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

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

其中n是页码*10

于 2012-07-08T11:52:24.967 回答
1

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

于 2012-07-08T11:55:00.833 回答
1

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

ALTER TABLE `your_table` AUTO_INCREMENT = 200

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

于 2012-07-08T11:58:34.600 回答