我们可以使用Guid作为Sqlite数据库中的主键

时间:2013-09-23 07:46:41

标签: android sqlite primary-key guid uuid

是否可以将GUID用作SQLITE数据库中的主键?如果可以,可以使用哪种数据类型?

2 个答案:

答案 0 :(得分:33)

SQLite本身不支持GUID作为内部类型。

除此之外,确实如此! (有点)。请记住,在SQLite中,任何字符串都可以用作类型名称,包括GUIDUUID(了解有关SQLite datatypes的更多信息)。

根据这些规则,GUID类型具有亲和力NONE,与BLOB字段相同。考虑到这一点,您可以创建GUID类型的列,并使用以下规则来访问它:

  • 将其存储为X'01020304050607080910111213141516'之类的字符串(X表示法用于表示16字节BLOB值)。 要插入,请使用:

    INSERT INTO mytable (uuid)
    VALUES (X'01020304050607080910111213141516');
    
  • 将其读为16字节BLOBquote(uuid)可用于使用X表示法格式化输出:

    SELECT quote(uuid)
    FROM mytable
    

此列也可用作主键。不幸的是,没有像整数主键那样的AUTOINCREMENT功能 - 你必须自己处理它。您可以使用randomblob(16)之类的简单内容,但它与定义by standardUUID不完全相同。

令人困惑的是,您还可以将UUID的文本表示存储在同一个字段中(SQLite不会阻止您这样做),但它将占用至少2倍的空间:BLOB是16字节,UUID至少是文本32个字节。

答案 1 :(得分:10)

sqlite3本身没有本机UUID 128位格式。

但是,GUID可以在SQLite中用作TEXT或二进制BLOB表示的键。

根据回答类似问题时发布的性能数字,二进制和字符串UUID在索引时可以在SQLite中高效创建和查询

见表格:https://stackoverflow.com/a/11337522/3103448

SQLite可以使用randomblob(16)hex(X)来创建BLOB或TEXT UUID例如:lower(hex(randomblob(16)))

通过类似的索引性能,显着的权衡取决于人类可读字符串是否优先于较小的二进制数据 < / p>