是否可以将GUID用作SQLITE数据库中的主键?如果可以,可以使用哪种数据类型?
答案 0 :(得分:33)
SQLite本身不支持GUID
作为内部类型。
除此之外,确实如此! (有点)。请记住,在SQLite中,任何字符串都可以用作类型名称,包括GUID
或UUID
(了解有关SQLite datatypes的更多信息)。
根据这些规则,GUID
类型具有亲和力NONE
,与BLOB
字段相同。考虑到这一点,您可以创建GUID
类型的列,并使用以下规则来访问它:
将其存储为X'01020304050607080910111213141516'
之类的字符串(X表示法用于表示16字节BLOB
值)。
要插入,请使用:
INSERT INTO mytable (uuid)
VALUES (X'01020304050607080910111213141516');
将其读为16字节BLOB
。 quote(uuid)
可用于使用X表示法格式化输出:
SELECT quote(uuid)
FROM mytable
此列也可用作主键。不幸的是,没有像整数主键那样的AUTOINCREMENT功能 - 你必须自己处理它。您可以使用randomblob(16)
之类的简单内容,但它与定义by standard的UUID
不完全相同。
令人困惑的是,您还可以将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>