2012-07-08 118 views
1

我使用auto-increment为我的数据库中的每个新条目分配一个id。 另外,我有一个php脚本,根据当前页码从这个数据库中选择10个entrys。 例如,如果当前页面为2,则脚本应选择id = 20和id = 29之间的每个条目。mysql自动增量 - 记录删除后重新分配

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

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

+1

是不是有没有使用LIMIT子句中的“偏移量”的原因? 'LIMIT 0,10',next page'LIMIT 10,10',next page'LIMIT 20,10',... – rodneyrehm 2012-07-08 11:47:12

+0

我从来没有听说过这个。我应该更好地研究了整个sql的东西: 非常感谢,这非常棒。 – Sprottenwels 2012-07-08 11:53:15

回答

6

这通常被认为是可取的:如果条目编号28被删除,也不会再像一个条目28。如果有人曾经试图引用它,那么他们显然试图引用已被删除的那个,并且您可以报告错误。

如果你回去,并重新分配28一些新的项目,现在你不知道的人是否意味着28纪录。

让我们退一步,重新审视您想要做的事情。您的目标不是显示2030之间的10个条目。你的目标是显示10个符合你的标准的条目。对于这一点,你可以使用内置的LIMITOFFSET方面:

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

OFFSET告诉MySQL从哪里开始计数和LIMIT告诉它如何不计其数。 MySQL将整个结果集放在一起,然后从第30个开始给你10个条目。这是你的第四页结果。现在它并不重要,它们碰巧拥有什么ID。

+0

不可能有更清楚的,谢谢:) – Sprottenwels 2012-07-08 11:58:09

3

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

通过使用LIMIT .. OFFSET子句,你就可以选择10个条目,开始第N个条目:

SELECT * 
FROM  table 
ORDER BY id 
LIMIT 10 
OFFSET 19 
  • LIMIT 10意味着回报只有10行
  • OFFSET 19意味着在第19行后返回行

这样,它如果某个ID已被删除且ID不连续,则无关紧要。

只要改变OFFSET:

  • 1 => 0 OFFSET
  • 页2 => OFFSET 9
  • 页3 => OFFSET 19
  • 页N => OFFSET(N- 1)* 10-1
+1

这应该是'LIMIT 0,10',因为这是一个基于零的偏移量? – rodneyrehm 2012-07-08 11:54:09

+0

你说得对,固定 – arnaud576875 2012-07-08 11:55:27

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; 
线做somethong
1

你可以,但你不应该。如果id = 29存在,您将自动增量重置为28,那么自动增量要使用id = 29但该记录已存在时会出现问题。

你会更好写像这样的查询:

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

其中n是* 10

1

重新分配自动增量值这是不好的做法,因为ID,可以在使用的页面数与其他表格的关系。忘了关于重新分配自动增量:)

2

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

ALTER TABLE `your_table` AUTO_INCREMENT = 200 

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