Android 在sqlite中搜索缺少的rowId
在“我的表”中,有已删除的行。我怎样才能找到第一个丢失的id 例: 我怎样才能找到Id 3不见了?Android 在sqlite中搜索缺少的rowId,android,sqlite,Android,Sqlite,在“我的表”中,有已删除的行。我怎样才能找到第一个丢失的id 例: 我怎样才能找到Id 3不见了? 这至少需要在android 3.0上运行,在SQLite 3.8.3或更高版本中,您可以使用以下查询查找特定范围内第一个未使用的ID: WITH RECURSIVE all_ids(id) AS ( VALUES(1) UNION ALL SELECT id + 1 FROM all_ids LIMIT 99999 ) SELECT id FROM all_ids WHERE
这至少需要在android 3.0上运行,在SQLite 3.8.3或更高版本中,您可以使用以下查询查找特定范围内第一个未使用的ID:
WITH RECURSIVE all_ids(id) AS (
VALUES(1)
UNION ALL
SELECT id + 1
FROM all_ids
LIMIT 99999
)
SELECT id
FROM all_ids
WHERE NOT EXISTS (SELECT 1
FROM MyTable
WHERE rowid = all_ids.id)
LIMIT 1
在早期的SQLite版本中,无法动态生成值。但是,所需的ID比已经存在的ID大一个,因此您可以从表中获取ID并检查下一个ID是否存在。零是处理空表的特殊情况:
SELECT id + 1
FROM (SELECT 0 AS id
UNION ALL
SELECT rowid
FROM MyTable
WHERE rowid <= 99999
) AS ids
WHERE NOT EXISTS (SELECT 1
FROM MyTable
WHERE rowid = ids.id + 1)
LIMIT 1
为什么您认为需要第一个缺少的ID?我需要生成一个唯一的ID,以便插入新行。生成的Id必须介于1和99999之间,因为99999之后的行是保留的或已使用的。它需要在android 3.0上运行,android 3.0具有SQLite 3.7.4。我最后在java中执行了一个for循环,并查询每个Id,直到找不到为止。可能不是最好的解决方案,但sqlite可能会做类似的事情。
SELECT id + 1
FROM (SELECT 0 AS id
UNION ALL
SELECT rowid
FROM MyTable
WHERE rowid <= 99999
) AS ids
WHERE NOT EXISTS (SELECT 1
FROM MyTable
WHERE rowid = ids.id + 1)
LIMIT 1