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