Mysql auto_increment以最低值继续

时间:2011-06-05 08:23:18

标签: mysql sql auto-increment

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

现在我想在ID 10处插入一行。

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

但是我希望数据库在制作之前首先填充ID 3-9。

有什么建议吗?

编辑:

澄清:这是我想为自己构建的URL缩短器。 我将id转换为单词(a-zA-z0-9)进行搜索,为了保存在数据库中,我将其转换为数字,即表格的ID。

现在的问题是: 我缩短了第一个链接(没有名字) - > ID为1,自动名称1转换为a-zA-Z0-9,即

接下来发生的事情 - > ID为2,名称为b,即2转换。

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

现在,如果有人添加了另一个没有名字的链接 - > ID为4597692 which,因为号码已转换。{/ 1>

我希望新行将自动插入到最后一个间隙(此处为3)

5 个答案:

答案 0 :(得分:0)

您可以根据需要随后删除/更新6个虚拟插入。根据设计,自动增量的概念旨在限制应用程序或用户对数字的控制,以确保输入表中的每条记录的唯一值。

答案 1 :(得分:0)

ALTER TABLE MY_TABLE AUTO_INCREMENT = 3;

答案 2 :(得分:0)

您必须找到第一个未使用的ID,将其存储为用户变量,将其用作插入ID。

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', ... );

如果仍然存在差距,则必须为每个插件运行两个查询,由您决定是否值得这样做。

答案 3 :(得分: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)

答案 4 :(得分:0)

您可以为URL ID设置另一个整数列。

您的流程可能如下所示:

  • 如果为链接生成默认名称,则只需插入新行,使用自动增量值填充URL ID列,然后将结果转换为相应的名称。

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

等等。查找整数ID时,您将使用URL ID列,而不是表自动增量列。

如果我遗失了什么,请告诉我。