我auto-increment
用来为数据库中的每个新条目分配一个 ID。另外,我有一个 php 脚本,它根据当前的页码从这个数据库中选择 10 个条目。例如,如果当前页面为 2,则脚本应选择 id=20 和 id=29 之间的每个条目。
现在,如果我删除一个条目,则 ID 将丢失。因此,当 id28 被删除时,脚本只会显示 9 个条目。
有没有办法auto-increment
在删除 e 记录后重新分配值?
我auto-increment
用来为数据库中的每个新条目分配一个 ID。另外,我有一个 php 脚本,它根据当前的页码从这个数据库中选择 10 个条目。例如,如果当前页面为 2,则脚本应选择 id=20 和 id=29 之间的每个条目。
现在,如果我删除一个条目,则 ID 将丢失。因此,当 id28 被删除时,脚本只会显示 9 个条目。
有没有办法auto-increment
在删除 e 记录后重新分配值?
这通常被认为是可取的:如果条目号28
被删除,将永远不会再有条目28
。如果有人尝试引用它,他们显然是在尝试引用已删除的那个,您可以报告错误。
如果您返回并重新分配28
到某个新条目,那么您现在不知道该人是指旧 28
记录还是新记录。
让我们退后一步,重新审视你想做的事情。您的目标不是在20
和之间显示十个条目30
。您的目标是显示十个符合您条件的条目。为此,您可以使用内置LIMIT
和OFFSET
术语:
SELECT ...
FROM ...
WHERE ...
OFFSET 29
LIMIT 10
告诉 MySQL从OFFSET
哪里开始计数并LIMIT
告诉它要计数多少。MySQL 会将整个结果集放在一起,然后从第 30 个条目开始为您提供 10 个条目。这是您的第四页结果。现在他们碰巧拥有什么 ID 已经无关紧要了。
您应该更改为页面选择条目的方式。
通过使用 LIMIT .. OFFSET 子句,您将能够选择 10 个条目,从第 N 个条目开始:
SELECT *
FROM table
ORDER BY id
LIMIT 10
OFFSET 19
LIMIT 10
表示只返回 10 行OFFSET 19
表示在第 19 行之后返回行这样,如果某些 id 已被删除并且 id 不是连续的,则无关紧要。
只需更改偏移量:
您的问题建议像这样的查询
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;
你可以,但你不应该。如果 id=29 存在,你将自增重设为 28,那么当自增想使用 id=29 但记录已经存在时,就会出现问题。
你最好写一个这样的查询:
select * from table order by ID LIMIT n,10;
其中n是页码*10
重新分配自动增量值是不好的做法,因为 id 可能与其他表相关使用。使用偏移/限制构造,忘记重新分配自动增量 :)
作为对您的问题 (auto_increment) 的直接回答,您可以使用以下查询更改其值:
ALTER TABLE `your_table` AUTO_INCREMENT = 200
下一个创建的项目将其下一个 AI 列值设置为 200。这在某些情况下很有用,尽管我同意您最好使用 LIMIT 偏移量。