Mysql自动增量以最小值继续

Mysql自动增量以最小值继续,mysql,sql,auto-increment,Mysql,Sql,Auto Increment,我的问题是:我有一个带有自动递增列的表。当我插入一些值时,一切正常。 插入第一行:ID 1 插入第二行:ID 2 现在我想在ID 10处插入一行 我的问题是,在此之后,只有在ID 10之后插入的行(这是正常行为) 但我希望数据库在创建之前先填充ID 3-9 有什么建议吗 编辑: 澄清一下:这是为了一个我想为自己构建的URL缩短器。 我将id转换为一个单词(a-zA-z0-9)以进行搜索,并将其转换为一个数字(表的id)以保存在数据库中 ALTER TABLE MY_TABLE AUTO_INCR

我的问题是:我有一个带有自动递增列的表。当我插入一些值时,一切正常。 插入第一行:ID 1 插入第二行:ID 2

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

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

但我希望数据库在创建之前先填充ID 3-9

有什么建议吗

编辑:

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

ALTER TABLE MY_TABLE AUTO_INCREMENT = 3;
现在的问题是: 我缩短了第一个链接(没有名称)->ID为1,自动将名称1转换为a-zA-Z0-9,这是一个

接下来,相同的happenes->ID是2,名称是b,它被2转换

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

现在,如果有人添加了另一个没有名字的链接->ID是
4597692,它将是
tesu
,因为数字已经转换


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

您可以进行6次虚拟插入,然后根据需要删除/更新它们。自动递增的概念在设计上是为了限制应用程序或用户对数字的控制,以确保输入到表中的每个记录都有一个唯一的值。

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

ALTER TABLE MY_TABLE AUTO_INCREMENT = 3;
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', ... );

如果仍然存在差距,则必须对每个插入都运行两个查询,这取决于您是否值得这样做。

不是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)

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

然后,您的流程可能如下所示:

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

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

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


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

谢谢,但是如果我在数据库中插入值(这是通过php页面),我希望它们自动设置在第三行。我想我不能每次设置一行并添加1并保存它,以便以后使用(我认为这不是很漂亮)。我想如果我继续使用1.2.3,然后大约1000,那就不太好了。但是一个好主意这个建议不好,只是因为要求不好+1说明自动生成的ARID是为了提供唯一性,而不是缺少间隙。为什么要这样?IDS3-9丢失有什么问题?我很想知道你为什么会面临这样的情况。这最终可能会成为一个非常棘手的问题,与您存储的实际数据无关(考虑到这些ID只是内部的)。另外,看看UUID是否是您正在寻找的替代方案。我正在尝试使我自己的链接缩短器。我将id转换为url名称并返回。如果我用名字JohnDoeJohnDoe做一个简短的链接,下一个想要随机名字的人将会有JohnDoeJohnDof,这可能太长了。@gluca,这会使插入变慢,通过对丢失的密钥进行无用的测试来降低数据库的速度,毫无益处。唯一需要做的是id是唯一的。如果重用以前使用过的ID,还将面临各种引用问题。MySQL删除数字时,顺序编号会中断。这是一个非常糟糕的主意。@gluca:我看不到
1
2
3
10
JohnDoeJohnDoe
…之间的联系,听起来不错,但是从id为null的表中选择table.id,limit 1返回一个空值result@gluca这不是piotrm回答的问题,你在说什么?@Johan好的,那么问题是什么?得到t1.id,其中t2.id为null,并且只得到一个结果。我只是对它进行了修改,使它适用于一张我没有多说的桌子。你能告诉我你的sql是如何工作的吗(不明白第三行的开头)?@gluca:这个答案中正好有一个表:
sometable
@ypercube:啊,现在我明白了,但是为什么会有一个
左连接
的想法(这让我觉得很抱歉)。这是为了组合两个表,不是吗?谢谢,但是我的意思是,(关于你的例子)如果我现在插入:插入到foo(id,row_id)值(10,11),然后插入:插入到foo(row_id)值(12),那么具有row_id 12的行的id应该是7而不是11。希望我已经正确地解释了它,这听起来不错,而且我认为它比每次搜索一个自由间隙有更好的性能,我可能会实现这个。非常感谢。