2015-06-19 47 views
0

在我的表中有一些行已被刪除。我怎樣才能找到第一個缺少的ID?在sqlite中搜索丟失的rowI

例:

ID DATA 
1 row1 
2 row2 
4 row3 
8 row4 

我怎樣才能找到ID爲3缺什麼? 這需要對Android 3.0的最低

+0

你爲什麼認爲你需要第一個缺失的ID? –

+0

我需要生成一個唯一的ID,以便我可以插入一個新行。生成的ID必須介於1和99999之間,因爲99999之後的行被保留或已被使用 – chris

回答

1

運行在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和檢查下一個是否存在(零是一種特殊情況來處理一個空表):

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 
+0

它需要在安裝了SQLite 3.7.4的android 3.0上運行。 – chris

+0

然後糾正這個問題。 –

+0

我結束了在java中執行for循環,並查詢每個id直到找不到一個。可能不是最好的解決方案,但可能sqlite會做類似的事情。 – chris