2013-06-24 876 views
36

是否可以使用UUID值作爲SQLite中的主鍵?我發現關於這個主題的信息非常有限,所以我不確定SQLite是否支持UUID數據類型。我應該將UUID存儲爲字符串嗎?在SQLite中使用UUID

回答

20

SQLite允許使用任何data type作爲主鍵。

UUID可以作爲字符串(這是人類可讀的)或16字節的BLOB(如果記錄太小而差別很大,可能會更快)存儲。

+0

要麼這些數據類型的更有效的比另一個存儲UUID? –

+2

對於其他讀者......人類可讀的36個字符的十六進制字符串看起來是這樣的:'988097c8-3f9c-4ecf-9d1d-64701bb9764c' –

+2

UUID BLOB VS TEXT重要文件的大小,但是,插入和查詢的速度大約是同樣,看http://stackoverflow.com/a/11337522/254109 – xmedeko

20

CL的回答是正確的,但是有些問題擺在眼前。如前所述,任何類型的列(或多列)都可以用作主鍵。所以你可能存儲UUID格式化,人類可讀的字符串格式,並使該表的關鍵。由於UUID只是一個128位的整數,所以您也可以將整數的字節存儲爲BLOB,我想這會稍微快一點。

但是爲了更直接地回答我認爲的問題,不,SQLite 不是有任何直接支持UUID的功能。 SQLite使用列的聲明類型來確定它將使用的五個底層storage classes(整數,實數,文本,blob或null)中的哪一個。但是列的聲明類型被忽略。所以沒有特定於UUID的列類型或存儲類。似乎也沒有任何functions可用於轉換格式化的UUID字符串。要獲得UUID的字節數,您需要查看應用程序編寫語言提供的方法。例如,Java的UUID類或Apple的NSUUID

4

不知道如何使用它作爲默認的領域,但如果有人需要生成以下辦法suggested here SQLite的查詢唯一值可用於:

的randomblob(N)函數返回一個包含N字節BLOB僞-random 字節。如果N小於1,則返回一個1字節的隨機數據塊。 提示:應用程序可生成一起使用此 功能可以用十六進制全局唯一標識符()和/或下部()是這樣的:

hex(randomblob(16)) 

lower(hex(randomblob(16))) 
+3

UUID不是'randomblob(16)',看到http://stackoverflow.com/a/22725697/254109如果你不需要精確的UUID,那麼'randomblob'就足夠了。 – xmedeko

+3

僞隨機字節與UUID不同。 – Bill