在SQLite中可以使用UUID值作为主键吗?我找到的有关该主题的信息极其有限,因此我不确定SQLite是否支持UUID数据类型。我是否应该将UUID存储为字符串?
jckbn6z71#
CL的回答是正确的,但有点回避了手头的问题。如前所述,任何类型的列(或多个列)都可以用作主键。因此,您可以将UUID存储为格式化的、人类可读的字符串,并将其作为表的键。由于UUID只是一个128位的整数,您还可以将该整数的字节存储为BLOB,这节省了空间,并且可能会稍微快一些。但为了更直接地回答我认为手头的问题,不,SQLite没有任何直接支持UUID的功能。当SQLite创建表时,它使用列的声明类型来确定它将使用五个底层storage classes(整数、实数、文本、BLOB或NULL)中的哪一个。在创建表之后,不使用列的类型,列的行为完全由其存储类决定。没有特定于UUID的列类型或存储类。似乎也没有任何functions可用于在格式化的UUID字符串之间进行转换。要获取UUID的字节数,您需要查看编写应用程序的语言提供了哪些方法。例如,Java的UUID类或苹果的NSUUID。
tpxzln5u2#
SQLite允许使用任何data type作为主键。UUID既可以存储为字符串(人类可读),也可以存储为16字节BLOB(如果记录很小,差异很大,则可能会更快)。
xqkwcwgp3#
现在有一个用于SQLite的扩展,它可以根据https://sqlite.org/src/file/ext/misc/uuid.c创建有效的uuid
ef1yzkbh4#
我需要在SQLite中实现UUID,因为它不是本地功能,所以这里是我在互联网上遇到的一个技巧。SQLite不支持UUID,所以我们的想法是创建一个使用randomblob()函数生成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不存储函数,因此可以使用触发器,一旦在表中插入新记录就可以调用该触发器
varchar
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都会受到空值的影响,之后触发器会将其修改为存储为varchar的新UUID值。解决方案灵感来自:solution source
mklgxw1f5#
不确定是否使用它作为默认字段,但如果有人需要在SQLite查询中生成唯一值,可以使用以下方法suggested here:
hex(randomblob(16))
或
lower(hex(randomblob(16)))
5条答案
按热度按时间jckbn6z71#
CL的回答是正确的,但有点回避了手头的问题。如前所述,任何类型的列(或多个列)都可以用作主键。因此,您可以将UUID存储为格式化的、人类可读的字符串,并将其作为表的键。由于UUID只是一个128位的整数,您还可以将该整数的字节存储为BLOB,这节省了空间,并且可能会稍微快一些。
但为了更直接地回答我认为手头的问题,不,SQLite没有任何直接支持UUID的功能。当SQLite创建表时,它使用列的声明类型来确定它将使用五个底层storage classes(整数、实数、文本、BLOB或NULL)中的哪一个。在创建表之后,不使用列的类型,列的行为完全由其存储类决定。没有特定于UUID的列类型或存储类。似乎也没有任何functions可用于在格式化的UUID字符串之间进行转换。要获取UUID的字节数,您需要查看编写应用程序的语言提供了哪些方法。例如,Java的UUID类或苹果的NSUUID。
tpxzln5u2#
SQLite允许使用任何data type作为主键。
UUID既可以存储为字符串(人类可读),也可以存储为16字节BLOB(如果记录很小,差异很大,则可能会更快)。
xqkwcwgp3#
现在有一个用于SQLite的扩展,它可以根据https://sqlite.org/src/file/ext/misc/uuid.c创建有效的uuid
ef1yzkbh4#
我需要在SQLite中实现UUID,因为它不是本地功能,所以这里是我在互联网上遇到的一个技巧。SQLite不支持UUID,所以我们的想法是创建一个使用
randomblob()
函数生成UUID的函数这将确保您将拥有一个可以作为
varchar
存储在您的表中的UUID,所以现在来实现它。SQLite不存储函数,因此可以使用触发器,一旦在表中插入新记录就可以调用该触发器以及触发点
因此,无论何时插入新行,默认情况下,id都会受到空值的影响,之后触发器会将其修改为存储为varchar的新UUID值。
解决方案灵感来自:solution source
mklgxw1f5#
不确定是否使用它作为默认字段,但如果有人需要在SQLite查询中生成唯一值,可以使用以下方法suggested here:
或