语法

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

    • 带大括号

    标准RFC4122指定带有大括号的格式。

    示例: {acde070d-8c4c-4f0d-9d8a-162843c10333}

    UUID值指定为字节。

    示例: b’kafef00ddeadbeed’

    • 用作URN
    类型转换

    UUID值可以转换为BYTES类型的数据。需要支持的字节字符串格式,例如,b’\141\061\142\062\143\063’。

    示例

    示例1:以标准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 |

    示例2:使用带大括号的格式创建具有UUID的表:

    INSERT INTO v VALUES (‘{63616665-6630-3064-6465-616462656563}’);

    SELECT * FROM v;

    token

    +———————————————————+

    63616665-6630-3064-6465-616462656562 63616665-6630-3064-6465-616462656563

    示例3:使用字节格式创建具有UUID的表

    示例4:使用用作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

    示例5:使用带有gen_random_uuid()函数的UUID列作为默认值,来创建创建一个包含自动生成的唯一行ID的表user:

    CREATE TABLE users (id UUID NOT NULL DEFAULT gen_random_uuid(), name STRING, PRIMARY KEY(id, name));

    CREATE TABLE

    INSERT INTO users(name) VALUES (‘小蓝’), (‘小红’), (‘小白’);

    INSERT 3

    SELECT * FROM users;

    id | name

    +———————————————————+———+

    8a4271fb-3e5a-46bd-9c13-fe18d4ad255e | 小红

    ab8f2a97-a893-4593-be2c-7743bfec43aa | 小白

    示例6:使用带有uuid_v4()函数的BYTES列作为默认值,来创建创建一个包含自动生成的唯一行ID的表user2:

    ​ 无论是示例5还是示例6,生成的ID都是128位,几乎没有机会生成非唯一值。此外,一旦表超出单个键值范围(默认情况下超过64MB),新的ID将散布在表的所有范围内,因此可能散布在不同的节点上。这意味着多个节点将分担负载。这种方法的缺点是创建一个主键,该主键在直接查询中可能没有用,这可能需要与另一个表或辅助索引联接。

    ​ 如果将生成的ID存储在相同的键值范围内很重要,则可以显式地或通过SERIAL伪类型将整数类型与unique_rowid()函数用作默认值,示例如下:

    示例7:使用unique_rowid()函数用作默认值:

    CREATE TABLE users3 (id INT DEFAULT unique_rowid(), name STRING, PRIMARY KEY(id, name));

    CREATE TABLE

    INSERT INTO users3(name) VALUES (‘小蓝’), (‘小红’), (‘小白’);

    INSERT 3

    SELECT * FROM users3;

    id | name

    +——————————+———+

    519264430636171265 | 小蓝

    519264430636269569 | 小红

    519264430636302337 | 小白

    ​ 在执行insert操作的过程中,unique_rowid()函数会根据执行insert节点的时间戳和ID生成默认值。 ​ 除在每个节点每秒生成超大量ID(100,000+)的这种情况以外,这种时间排序的值几乎是全局唯一的。同样,可能存在差距,不能完全保证顺序。