New in v1.1: UUID(通用唯一标识符)数据类型存储128位值,该值在空间和时间上都是唯一的。

要自动生成唯一行ID,我们建议使用带有gen_random_uuid()函数的UUID作为默认值。 有关详细信息,请参阅下面的示例。

语法

可以使用以下格式表示UUID值:

Format Description
标准RFC4122指定的格式 连字符分隔的8,4,4,4,12个十六进制数字组。

示例: acde070d-8c4c-4f0d-9d8a-162843c10333
带括号 标准RFC4122指定带有大括号的格式。

示例: {acde070d-8c4c-4f0d-9d8a-162843c10333}
作为BYTES UUID值指定为字节。

示例: b'kafef00ddeadbeed'
UUID用作URN UUID可以用作统一资源名称(URN)。在这种情况下,格式指定为“urn:uuid:”,后面跟着标准的RFC4122指定格式。

示例: urn:uuid:63616665-6630-3064-6465-616462656564

大小

UUID值的宽度为128位,但由于CockroachDB元数据因素,总存储大小可能会更大。

示例

使用手动输入的UUID值创建表

以标准RFC4122指定格式-使用大括号创建具有UUID的表

> CREATE TABLE v (token uuid);

> INSERT INTO v VALUES ('63616665-6630-3064-6465-616462656562');

> SELECT * FROM v;
+--------------------------------------+
|                token                 |
+--------------------------------------+
| 63616665-6630-3064-6465-616462656562 |
+--------------------------------------+
(1 row)

使用字节格式的UUID创建表

> INSERT INTO v VALUES ('{63616665-6630-3064-6465-616462656563}');

> SELECT * FROM v;
+--------------------------------------+
|                token                 |
+--------------------------------------+
| 63616665-6630-3064-6465-616462656562 |
| 63616665-6630-3064-6465-616462656563 |
+--------------------------------------+
(2 rows)

以字节格式创建一个带有UUID的表

> INSERT INTO v VALUES (b'kafef00ddeadbeed');

> SELECT * FROM v;
+--------------------------------------+
|                token                 |
+--------------------------------------+
| 63616665-6630-3064-6465-616462656562 |
| 63616665-6630-3064-6465-616462656563 |
| 6b616665-6630-3064-6465-616462656564 |
+--------------------------------------+
(3 rows)

使用用作URN的UUID创建一个表

> INSERT INTO v VALUES ('urn:uuid:63616665-6630-3064-6465-616462656564');

> SELECT * FROM v;
+--------------------------------------+
|                token                 |
+--------------------------------------+
| 63616665-6630-3064-6465-616462656562 |
| 63616665-6630-3064-6465-616462656563 |
| 6b616665-6630-3064-6465-616462656564 |
| 63616665-6630-3064-6465-616462656564 |
+--------------------------------------+
(4 rows)

创建一个包含自动生成的唯一行ID的表

要自动生成唯一行ID,请使用带有gen_random_uuid()函数的UUID列作为默认值:

CREATE TABLE t1 (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name STRING);
INSERT INTO t1 (name) VALUES ('a'), ('b'), ('c');
SELECT * FROM t1;
+--------------------------------------+------+
|                  id                  | name |
+--------------------------------------+------+
| 60853a85-681d-4620-9677-946bbfdc8fbc | c    |
| 77c9bc2e-76a5-4ebc-80c3-7ad3159466a1 | b    |
| bd3a56e1-c75e-476c-b221-0da9d74d66eb | a    |
+--------------------------------------+------+
(3 rows)

或者,你可以使用带有uuid_v4()函数的BYTES列作为默认值:

CREATE TABLE t2 (id BYTES PRIMARY KEY DEFAULT uuid_v4(), name STRING);
INSERT INTO t2 (name) VALUES ('a'), ('b'), ('c');
SELECT * FROM t2;
+---------------------------------------------------+------+
|                        id                         | name |
+---------------------------------------------------+------+
| "\x9b\x10\xdc\x11\x9a\x9cGB\xbd\x8d\t\x8c\xf6@vP" | a    |
| "\xd9s\xd7\x13\n_L*\xb0\x87c\xb6d\xe1\xd8@"       | c    |
| "\uac74\x1dd@B\x97\xac\x04N&\x9eBg\x86"           | b    |
+---------------------------------------------------+------+
(3 rows)

在任何一种情况下,生成的ID都是128位,基数足够大,所以几乎不可能生成重复值。此外,一旦表增长超出单个键值范围(默认情况下超过64MB),新ID将分散在所有表的ranges内,因此可能跨越不同的节点。 这意味着多个节点将分担负载。 如果需要生成的ID存储在相同的key-value range内,你可以使用SERIAL数据类型,它是INT的别名,unique_rowid()函数作为默认值:

CREATE TABLE t3 (id SERIAL PRIMARY KEY, name STRING);
INSERT INTO t3 (name) VALUES ('a'), ('b'), ('c');
SELECT * FROM t3;
+--------------------+------+
|         id         | name |
+--------------------+------+
| 293807573840855041 | a    |
| 293807573840887809 | b    |
| 293807573840920577 | c    |
+--------------------+------+
(3 rows)

在执行insert过程中,unique_rowid()函数会根据执行insert节点的时间戳和ID生成默认值。 除非在每个节点每秒生成超大量ID(100,000+)的情况下,否则这种时间排序的值几乎是全局唯一的。

支持的转换

UUID值可以转换为以下数据类型:

Type Details
BYTES 需要支持的BYTES字符串格式,例如b'\141\061\142\062\143\063'.

See Also

Data Types