我的问题是:我有一个带有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)
答案 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列,而不是表自动增量列。
如果我遗失了什么,请告诉我。