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