如果是,则在SQLITE中是否存在UID数据类型,然后如何为其生成值

amy*_*amy 29 sqlite uid

我正在创建这样的表:

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY  KEY (id))
Run Code Online (Sandbox Code Playgroud)

如何在表foobar中插入或生成id字段的值?

Mik*_*ll' 55

你可以说SQLite根本不支持数据类型.例如,在SQLite3中,您可以执行此操作.

sqlite> create table test (id wibblewibble primary key);
Run Code Online (Sandbox Code Playgroud)

SQLite很乐意创建一个具有"数据类型"wibblewibble的列.SQLite还将愉快地使用"数据类型"uuid,guid和SuperChicken创建列.

关键是你可能会自动生成一个uid.SQLite对你帮助不大.

您可以将其完全留给客户端程序.如果你在python中编程,请使用uuid模块.在ruby中,您有SecureRandom.uuid函数.其他语言具有类似的功能或解决方法.

您可以在C中编写自己的uid生成函数.(请参阅创建或重新定义SQL函数.)我称之为相对极端的方法.

您可以将其存储为二进制文本格式.


其他网上对话表明,有大约UUID什么是广泛的误解.UUID不仅仅是128位随机数.UUID具有结构和规则.请参阅RFC 4122.

  • 感谢您的帮助。我为 Android 应用程序生成了 UUID,例如 String sUUiDValue=UUID.randomUUID().toString(); 然后插入表... (3认同)

Tim*_*ick 21

Benjamin Berry的答案不对 - 它会产生格式错误的UUID - 但它显示了一种有趣的技术,使用子选择生成随机性,然后从中选择子串.这是类似的,我已经确认确实有效:

select substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',abs(random()) % 4 + 1, 1) as v);
Run Code Online (Sandbox Code Playgroud)

一些示例输出:

c71122df-18e4-4a78-a446-fbf7b8f2969b
61e75f87-978b-4d9e-b587-bedcc2d23898
30eee0fa-2ff2-4ff5-b8ef-f99378272999
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它为我的迁移副本从一个表创建了20个完全相同的uuids(我将_id从int更改为此uuid) (2认同)
  • 与@miroslavign相同,如果在一个请求中使用更新所有表记录,例如,生成完全相同的uuid foreach记录. (2认同)
  • 这与时间、种子或毫秒无关(伪随机生成器并不是在每次调用时都播种),该表达式只是由 SQLite 计算一次。在查询中,您不会请求“多个”值,您只是说要多次使用它,因此 SQLite 使用一个值来满足您的请求。请记住,SQL 不是命令式的,因此更新/选择不一定是循环。 (2认同)

Mik*_*stö 17

这是类似的东西,可以直接用作表达式:

lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))
Run Code Online (Sandbox Code Playgroud)

例如,作为列的默认值传递:

sqlite> create table "table" (
  "id" char(36) default (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))), 
  "data" varchar(255), primary key ("id")
);

sqlite> insert into "table" ("data") values ('foo');
sqlite> insert into "table" ("data") values ('bar');
sqlite> select * from "table";
947efcc9-4212-442a-b68c-eb6fbd8a7128|foo
a2c3857b-1eb4-40bd-aed2-6e8d68cc2ab8|bar
Run Code Online (Sandbox Code Playgroud)

  • 它选择要放入的下一个字符是'8','9','a'或'b'.它来自UUID规范并告诉它这是UUID变体1 https://en.wikipedia.org/wiki/Universally_unique_identifier#Variants (3认同)
  • 这里发生了什么: substr('89ab',abs(random()) % 4 + 1, 1) (2认同)