在SQLite中使用UUID

Mik*_*ter 51 sqlite uuid

是否可以在SQLite中使用UUID值作为主键?我发现关于这个主题的信息非常有限,所以我不确定SQLite是否支持UUID数据类型.我应该将UUID存储为字符串吗?

CL.*_*CL. 27

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

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

  • 对于其他读者......人类可读的36个字符的十六进制字符串如下所示:`988097c8-3f9c-4ecf-9d1d-64701bb9764c` (3认同)
  • UUID BLOB vs TEXT对文件大小很重要,但插入和查询的速度大致相同,请参阅http://stackoverflow.com/a/11337522/254109 (2认同)

spa*_*y21 27

CL的答案是正确的,但有点像边缘的问题.如上所述,任何类型的列(或多列)都可以用作主键.因此,您可以将UUID存储在格式化的,人类可读的字符串格式中,并将其作为表的密钥.由于UUID只是一个128位整数,你也可以将整数的字节存储为BLOB,我想这会稍快一些.

但更直接地回答了我认为这个问题在手,不,SQLite的也不会有直接支持UUID的任何功能.SQLite使用列的声明类型来确定它将使用的五个底层存储类(整数,实数,文本,blob或null)中的哪一个.但是否则忽略列的声明类型.因此,没有特定于UUID的列类型或存储类.似乎没有任何可用于转换格式化UUID字符串和从格式化UUID字符串转换的函数.要获取UUID的字节,您需要查看应用程序编写语言提供的方法.例如,Java的UUID类或Apple的NSUUID.


Idh*_*hem 9

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

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

  • 我的意思是 UUID 没有定义为 sqlite 中的数据类型,请检查此 https://www.sqlite.org/datatype3.html 接受的答案表明 UUID 可以在 sqlite 中存储为字符串。与支持 UUID 作为数据类型的 postgresql 不同,它可以帮助您自动生成 UUID (5认同)

DrG*_*rGo 8

现在有一个 sqlite 扩展,可以按照https://sqlite.org/src/file/ext/misc/uuid.c创建有效的 uuid

  • 有点繁琐..有关详细信息,请参阅此处https://www.sqlite.org/loadext.html#:~:text=An%20SQLite%20extension%20is%20a,使用%20the%20sqlite3_load_extension()%20API。 (4认同)

sht*_*lik 5

不确定是否将其用作默认字段,但如果有人需要在 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)

  • UUID 不是 `randomblob(16)`,请参阅 http://stackoverflow.com/a/22725697/254109 如果您不需要确切的 UUID,那么 `randomblob` 就足够了。 (12认同)
  • 伪随机字节_不_与 UUID 相同。 (9认同)