Postgresql 如何生成没有破折号的UUID

Postgresql 如何生成没有破折号的UUID,postgresql,Postgresql,我正在创建一个具有以下表定义的表 CREATE TABLE auth( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), role VARCHAR(64) ); 生成的UUID格式为a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11postgres也接受不带连字符的UUID。我们如何指定自动生成的UUID中没有连字符?这里有一个可行的解决方案,可以实

我正在创建一个具有以下表定义的表

CREATE TABLE auth(
    id                  UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    role                VARCHAR(64)
);

生成的UUID格式为
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
postgres也接受不带连字符的UUID。我们如何指定自动生成的UUID中没有连字符?

这里有一个可行的解决方案,可以实现与您要求的接近:

CREATE TABLE foo (
  ts TIMESTAMP WITH TIME ZONE,
  uuid VARCHAR DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )
); 

INSERT INTO foo ( ts ) VALUES ( now() );
但是(它是一个大但)这里我们将
uuid
转换成
字符串
,这意味着索引本身将比数字或真正的
uuid
昂贵得多

在本文中,您可以找到一个很好的解释:


据我所知,Postgres的uuid使用连字符,即使您试图删除它们:

CREATE TABLE foo (
  ts TIMESTAMP WITH TIME ZONE,
  queue UUID DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )::uuid,
);

INSERT INTO foo ( ts ) VALUES ( now() );

上面的例子在Postgres 9.6中运行得很好,但是当我们回溯到
uuid时,会添加回连字符。

uuid数据类型不包含破折号。只有在显示数据时才会显示破折号。类似于没有格式的日期。哇!我可以用UUID进行查询,但不使用连字符!手册中详细说明了这一点:连字符不存储在列中。它们仅在显示值时生成。