39

我正在创建这样的表:

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY  KEY (id))

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

4

5 回答 5

66

您可以争辩说 SQLite 根本不支持数据类型。例如,在 SQLite3 中,您可以这样做。

sqlite> create table test (id wibblewibble primary key);

SQLite 将愉快地创建一个具有“数据类型”wibblewibble 的列。SQLite 还将愉快地创建具有“数据类型”uuid、guid 和 SuperChicken 的列。

对你来说关键点可能是如何自动生成一个 uid。SQLite 在那里帮不了你太多。

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

您可以用 C 编写自己的 uid 生成函数。(请参阅创建或重新定义 SQL 函数。)我认为这是一种相对极端的方法。

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


其他在线对话表明,对于 UUID是什么存在广泛的误解。UUID 不仅仅是一个 128 位的随机数。UUID 具有结构和规则。请参阅RFC 4122

于 2012-04-11T11:57:38.417 回答
24

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);

一些示例输出:

c71122df-18e4-4a78-a446-fbf7b8f2969b
61e75f87-978b-4d9e-b587-bedcc2d23898
30eee0fa-2ff2-4ff5-b8ef-f99378272999
于 2014-03-29T01:05:30.847 回答
22

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

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)))

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

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
于 2017-01-14T12:01:09.660 回答
2

一个项目需要这个

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16)
from (
select lower(hex(randomblob(16))) AS UUID 
);
于 2014-02-18T23:34:26.590 回答
-1

我创建了一个用户定义的函数(为我的 c# 应用程序中的 guid/uuid 列生成默认值)

var connection = new SqliteConnection("DataSource=:memory:");
connection.CreateFunction("newid", Guid.NewGuid); 
于 2020-09-09T09:10:16.347 回答