gpt4 book ai didi

java - 如何使用 SQLite ID 自动增量?

转载 作者:行者123 更新时间:2023-12-01 16:20:39 25 4
gpt4 key购买 nike

我通过 ID 访问数据库中的项目,但是当我删除行,然后插入某些内容时,ID 也会增加,因此在 ID 之间留下间隙。

例如项目1(ID=1)、项目2(ID=2)、项目3(ID=3) ==删除+插入===> 项目1(ID=1)、项目2(ID=2)、项目3(ID=4)

当我想通过 ID 访问项目时,有什么解决方法吗?

最佳答案

这里涵盖 3 件事:

  1. 管理 self 提升
  2. 更改自动增量序列
  3. 不用担心间隙

管理自己的增量(无自动增量)

您不必像 Nicolas 在评论中提到的那样使用自动增量 ID。您可以自己手动输入或内联查询,如下所示:

create table test (id, name);
insert into test select coalesce(max(id)+1, 1), 'john' from test;
select * from test;
id name
---------- ----------
1 john

insert into test select coalesce(max(id)+1, 1), 'mary' from test;
select * from test;
id name
---------- ----------
1 john
2 mary

insert into test select coalesce(max(id)+1, 1), 'abcdefg' from test;
sqlite> select * from test;
id name
---------- ----------
1 john
2 mary
3 abcdefg

delete from test where id = 3;
insert into test select coalesce(max(id)+1, 1), 'rubio' from test;
sqlite> select * from test;
id name
---------- ----------
1 john
2 mary
3 rubio

使用自动增量但重置下一个值

您可以使用整数自动增量字段并将下一个序列重置为下一个值,以免留下这样的间隙:

create table test1 (id integer primary key autoincrement, name text);
insert into test1 (name) values ('john');
insert into test1 (name) values ('mary');

-- let's create a gap
delete from test1 where id = 2;

-- let's fill the gap back up
update sqlite_sequence set seq = (select max(id) FROM test1) where name='test1';
insert into test1 (name) values ('tony');
select * from test1;
id name
---------- ----------
1 john
2 tony

请参阅此处的相关文档:https://sqlite.org/fileformat2.html#seqtab

不要关心完美的 ID

虽然您希望 ID 是连续的,但我想说 - 不要担心间隙。您为每一行提供一个 ID 以唯一地标识它们。如果第一行由 100 唯一标识,第二行由 -90 唯一标识,那又怎样呢?就这样吧。

我的建议是保持自动增量不变。如果你删除表格中间的一行,那就没问题了。不用担心间隙。

关于java - 如何使用 SQLite ID 自动增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62293324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com