在 SQLite 中使用 UUID

问题描述 投票:0回答:5

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

sqlite uuid
5个回答
67
投票

CL 的 answer 是正确的,但有点回避了当前的问题。如前所述,任何类型的一列(或多列)都可以用作主键。因此,您可以将 UUID 存储为格式化的、人类可读的字符串,并将其作为表的键。由于 UUID 只是一个 128 位整数,因此您还可以将整数的字节存储为 BLOB,这样可以节省空间并且可能会稍微快一些。

但是要更直接地回答我认为手头的问题,不,SQLite 没有任何直接支持 UUID 的功能。当 SQLite 创建表时,它使用列的声明类型来确定将使用五个基础存储类(整数、实数、文本、blob 或 null)中的哪一个。创建表后,不会使用列的类型,列的行为完全由其存储类决定。没有特定于 UUID 的列类型或存储类。似乎也没有任何 functions 可用于与格式化 UUID 字符串之间的转换。要获取 UUID 的字节,您需要查看编写应用程序的语言提供了哪些方法。例如,Java 的 UUID 类、Apple 的 NSUUID 或 Swift 的 UUID


63
投票

SQLite 允许使用任何数据类型作为主键。

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


19
投票

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

创建有效的 uuid

9
投票

我需要在 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 值。

解决方案灵感来自:解决方案来源


4
投票

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

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

hex(randomblob(16)) 

lower(hex(randomblob(16))) 
© www.soinside.com 2019 - 2024. All rights reserved.