Mysql自动增量以最小值继续
我的问题是:我有一个带有自动递增列的表。当我插入一些值时,一切正常。 插入第一行:ID 1 插入第二行:ID 2 现在我想在ID 10处插入一行 我的问题是,在此之后,只有在ID 10之后插入的行(这是正常行为) 但我希望数据库在创建之前先填充ID 3-9 有什么建议吗 编辑: 澄清一下:这是为了一个我想为自己构建的URL缩短器。 我将id转换为一个单词(a-zA-z0-9)以进行搜索,并将其转换为一个数字(表的id)以保存在数据库中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
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。希望我已经正确地解释了它,这听起来不错,而且我认为它比每次搜索一个自由间隙有更好的性能,我可能会实现这个。非常感谢。