在SQLite中是否可以使用UUID作为主键?有关该主题的信息非常有限,因此我不确定SQLite是否支持UUID数据类型。我应该将UUID存储为字符串吗?
但是为了更直接回答我认为是问题的核心,不,SQLite没有任何直接支持UUID的功能。当SQLite创建一个表时,它使用列声明的类型来确定使用五种底层存储类(整数、实数、文本、二进制大对象或空)中的哪一种。表创建后,列的类型不再使用,列的行为完全由其存储类确定。没有特定于UUID的列类型或存储类。也似乎没有可用于转换为和从格式化的UUID字符串的函数。要获取UUID的字节,您需要查看应用程序所使用语言提供的方法。例如,Java的UUID类,Apple的NSUUID,或Swift的UUID。
gcc -g -fPIC -dynamiclib uuid.c -o uuid.c.dylib
。然后在sqlite3中执行SELECT load_extension('uuid.c');
。 - zvxr我需要在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)))
这将确保您拥有一个可以存储在表中的UUID,其类型为varchar
,现在开始实施。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;
不确定是否将其用作默认字段,但如果有人需要在sqlite查询中生成唯一值,则可以使用此处建议的方法:
randomblob(N)函数返回一个包含伪随机字节的N字节Blob。 如果N小于1,则返回1字节的随机Blob。 提示:应用程序可以使用此函数与hex()和/或lower()一起生成全局唯一标识符,如下所示:
hex(randomblob(16))
或者
lower(hex(randomblob(16)))
988097c8-3f9c-4ecf-9d1d-64701bb9764c
。 - Basil Bourque