在SQLite中使用UUID

时间:2013-06-24 14:18:10

标签: sqlite uuid

是否可以在SQLite中使用UUID值作为主键?我发现关于这个主题的信息非常有限,所以我不确定SQLite是否支持UUID数据类型。我应该将UUID存储为字符串吗?

5 个答案:

答案 0 :(得分:24)

CL的回答是正确的,但有点像边缘的问题。如上所述,任何类型的列(或多列)都可以用作主键。因此,您可以以格式化的,人类可读的字符串格式存储UUID,并将其作为表格的密钥。由于UUID只是一个128位整数,你也可以将整数的字节存储为BLOB,我想这会更快一些。

但是为了更直接地回答我认为是手头的问题,不,SQLite 有任何直接支持UUID的功能。 SQLite使用列的声明类型来确定它将使用的五个基础storage classes(整数,实数,文本,blob或null)中的哪一个。但是否则忽略列的声明类型。因此,没有特定于UUID的列类型或存储类。似乎没有任何functions可用于转换为格式化的UUID字符串或从格式化的UUID字符串转换。要获取UUID的字节,您需要查看应用程序编写语言提供的方法。例如,Java的UUID类或Apple的NSUUID

答案 1 :(得分:21)

SQLite允许使用任何data type作为主键。

UUID可以存储为字符串(人类可读)或16字节BLOB(如果记录太小而差异很大,则可能更快)。

答案 2 :(得分:6)

现在有一个 sqlite 扩展,可以按照 https://sqlite.org/src/file/ext/misc/uuid.c

创建有效的 uuid

答案 3 :(得分:3)

不确定将其用作默认字段,但如果有人需要在sqlite查询中生成唯一值,则可以使用以下方法suggested here

randomblob(N)函数返回包含伪随机的N字节blob 字节。如果N小于1,则返回1字节的随机blob。 提示:应用程序可以使用此方法生成全局唯一标识符 与hex()和/或lower()一起使用,如下所示:

hex(randomblob(16)) 

lower(hex(randomblob(16))) 

答案 4 :(得分:0)

我需要在sqlite中实现UUID,因为它不是本机功能,所以这是我在互联网上遇到的一个技巧。 SQLite不支持UUID,因此该想法是创建一个使用randomblob()函数

生成UUID的函数。
select lower(hex( randomblob(4)) || '-' || hex( randomblob(2))
         || '-' || '4' || substr( hex( randomblob(2)), 2) || '-'
         || substr('AB89', 1 + (abs(random()) % 4) , 1)  ||
         substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6))) 

这将确保您将拥有一个可以作为varchar存储在表中的UUID,因此现在就可以实现它。 SQLite不存储函数,因此您可以使用一个触发器,一旦在表中插入了一条新记录,便可以调用该触发器

CREATE TABLE UUID_TABLE(
   id varchar(500),
   name varchar(500) NOT NULL,
   CONSTRAINT name_unique UNIQUE (name),
   CONSTRAINT rid_pkey PRIMARY KEY (id)
);

和触发器

CREATE TRIGGER AutoGenerateGUID_RELATION_3
AFTER INSERT ON UUID_TABLE
FOR EACH ROW
WHEN (NEW.relation_id IS NULL)
BEGIN
   UPDATE UUID_TABLE SET relation_id = (select lower(hex( randomblob(4)) || '-' ||      hex( randomblob(2))
             || '-' || '4' || substr( hex( randomblob(2)), 2) || '-'
             || substr('AB89', 1 + (abs(random()) % 4) , 1)  ||
             substr(hex(randomblob(2)), 2) || '-' || hex(randomblob(6))) ) WHERE rowid = NEW.rowid;
END;

因此,无论何时插入新行,默认情况下ID都会影响NULL值,此后触发器将其修改为存储为varchar的新UUID值。

解决方案的灵感来自solution source