是否可以在SQLite中使用UUID值作为主键?我发现关于这个主题的信息非常有限,所以我不确定SQLite是否支持UUID数据类型.我应该将UUID存储为字符串吗?
spa*_*y21 27
CL的答案是正确的,但有点像边缘的问题.如上所述,任何类型的列(或多列)都可以用作主键.因此,您可以将UUID存储在格式化的,人类可读的字符串格式中,并将其作为表的密钥.由于UUID只是一个128位整数,你也可以将整数的字节存储为BLOB,我想这会稍快一些.
但更直接地回答了我认为这个问题在手,不,SQLite的也不会有直接支持UUID的任何功能.SQLite使用列的声明类型来确定它将使用的五个底层存储类(整数,实数,文本,blob或null)中的哪一个.但是否则忽略列的声明类型.因此,没有特定于UUID的列类型或存储类.似乎没有任何可用于转换格式化UUID字符串和从格式化UUID字符串转换的函数.要获取UUID的字节,您需要查看应用程序编写语言提供的方法.例如,Java的UUID类或Apple的NSUUID.
我需要在 sqlite 中实现 UUID,因为它不是本机功能,所以这是我在互联网上遇到的一个技巧。randomblob()
SQLite 不支持 UUID,因此我们的想法是创建一个函数,使用该函数生成 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)))
Run Code Online (Sandbox Code Playgroud)
这将确保您拥有一个可以作为 存储在表中的 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)
);
Run Code Online (Sandbox Code Playgroud)
和触发器
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;
Run Code Online (Sandbox Code Playgroud)
因此,每当插入新行时,默认情况下 id 都会受到 NULL 值的影响,之后触发器会将其修改为存储为 varchar 的新 UUID 值。
解决方案灵感来自:解决方案来源
现在有一个 sqlite 扩展,可以按照https://sqlite.org/src/file/ext/misc/uuid.c创建有效的 uuid
不确定是否将其用作默认字段,但如果有人需要在 sqlite 查询中生成唯一值,可以使用以下建议的方法:
randomblob(N) 函数返回一个包含伪随机字节的 N 字节 blob。如果 N 小于 1,则返回一个 1 字节的随机 blob。提示:应用程序可以使用此函数以及 hex() 和/或 lower() 生成全局唯一标识符,如下所示:
hex(randomblob(16))
Run Code Online (Sandbox Code Playgroud)
或者
lower(hex(randomblob(16)))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34397 次 |
最近记录: |