2011-06-05 81 views
1

我的问题是:我有一个auto_increment列的表。当我插入一些值时,一切都是正确的。 插入第一行:1 ID插入 第二行:ID 2Mysql auto_increment以最低值继续

现在我想在ID插入一行10.

我的问题是,在此之后,只有ID 10之后插入的行(其是正常行为)。

但我希望数据库首先在填写ID 3-9之前填写。

有什么建议吗?

编辑:

为了澄清:这是一个短网址我想建立自己。 我将id转换为一个单词(a-zA-z0-9)进行搜索,并保存在数据库中,我将它转换为一个数字,即表中的ID。

现在的问题是: 我缩短第一链路(没有名字) - > ID是1,并且自动名称1转换为-ZA-Z0-9其是

接着同一happenes - > ID是2,名字是b,这是2转换。

接下来有趣,有人要命名链接test - > ID为4597691这是转换test

现在,如果有人增加了一个链接,没有名字 - > ID是4597692 whichtesu因为数字转换。

我希望新的行会在

+0

你为什么要这样做? ids 3-9失踪怎么了? – 2011-06-05 08:55:10

+0

我真的很想知道你为什么要面对这样的情况。这可能最终会成为一个非常棘手的问题,与您存储的实际数据无关(考虑到这些ID只是内部的问题)。另外,看看UUID是否是你正在寻找的替代品 – Jai 2011-06-05 09:11:08

+0

我试图让自己的链接缩短。我将id转换为url名称并返回。如果我与JohnDoeJohnDoe这个名字做一个简短的链接,那么下一个想要拥有随机名的下一个将会有JohnDoeJohnDof,那可能太长了。 – Sonnenhut 2011-06-05 09:15:03

回答

0

你可以为URL标识另一个整数列。然后

你的过程可能是这样的:

  • 如果提供的链接生成默认名称,那么您只需插入新行,填充自动递增值的URL ID列,然后将结果转换为相应的名称。

  • 如果为一个URL指定了一个自定义名称,那么在插入一行之后,URL ID列将填充从将所选名称转换为整数所获得的数字。

依此类推。查找整数ID时,您将使用URL ID列,而不是表格自动增量列。

如果我错过了一些东西,请告诉我。

+0

这听起来不错,我认为它比搜索每次都有更多的性能,我可能会实现这一点。谢谢。 – Sonnenhut 2011-06-05 10:28:33

0

你可以做6个虚拟插入和删除/以后更新它们作为你需要作出最后的差距(这里3)自动插入。自动增量的概念在设计上意在限制应用程序或用户对数字的控制,以确保输入到表格中的每条记录具有唯一的值。

+0

我认为如果我继续使用1.2.3,然后使用类似1000的东西,情况就不那么好了。但是一个好主意 – Sonnenhut 2011-06-05 08:36:57

+0

建议不好,但仅仅是因为请求不好。 +1使自动生成的点是ID可以提供**唯一性**而不是缺少空位**。 – 2011-06-05 09:27:55

0
ALTER TABLE MY_TABLE AUTO_INCREMENT = 3; 
+0

谢谢,但是如果我将数值插入到我的数据库中(这是通过php页面),我希望它们自动设置在第三行。我想我无法每次设置一行并添加1并保存它,稍后使用它(我认为这不是很漂亮)。 – Sonnenhut 2011-06-05 08:35:40

0

您将不得不找到第一个未使用的id,将其存储为用户变量,使用id作为insert。

SELECT @id := t1.id +1 
FROM sometable t1 LEFT JOIN sometable t2 
ON t2.id = t1.id +1 WHERE t2.id IS NULL LIMIT 1; 

INSERT INTO sometable(id, col1, col2, ...) VALUES(@id, 'aaa', 'bbb', ...); 

你将不得不为每个刀片上运行两个查询,如果你还是有差距,其由你来决定是否值得这样做。

+0

这听起来不错,但**从table中选择table.id其中id为null limit 1 **返回空结果 – Sonnenhut 2011-06-05 09:06:41

+1

@gluca,**这不是** piotrm答案中的查询,你在说什么? – Johan 2011-06-05 09:16:42

+0

@Johan好吧,那么查询是什么?你得到t1.id,其中t2.id为空,并且只得到一个结果。我只修改它,它适用于我没有说过的一张桌子。你能说你的SQL如何工作(不理解第三行的开始)? – Sonnenhut 2011-06-05 09:34:32

0

不是100%确定你想要什么来实现,但这样的事情可能工作:

drop table if exists foo; 
create table foo 
(
id int unsigned not null auto_increment primary key, 
row_id tinyint unsigned unique not null default 0 
) 
engine=innodb; 

insert into foo (row_id) values (1),(2),(10),(3),(7),(5); 

select * from foo order by row_id; 

+----+--------+ 
| id | row_id | 
+----+--------+ 
| 1 |  1 | 
| 2 |  2 | 
| 4 |  3 | 
| 6 |  5 | 
| 5 |  7 | 
| 3 |  10 | 
+----+--------+ 
6 rows in set (0.00 sec) 
+0

谢谢,但我的意思是,(关于你的例子)如果我现在插入:insert into foo(id,row_id)values(10,11),然后insert:insert into foo(row_id)values(12)then id row_id 12的行应该是7而不是11.希望我已经解释了正确的 – Sonnenhut 2011-06-05 09:39:13