PostgreSQL数据库怎么生成一个随机的UUID
如果需要在pg数据库中生成UUID做表的主键该如何实现,有两种方法:
方法一:使用pgcrypto
扩展的pg_random_uuid()
函数
要在PostgreSQL中使用pg_random_uuid()
函数,你需要首先确保pgcrypto
扩展已经被安装在你的数据库中,并且对于你想要使用它的数据库(或schema)已经启用了这个扩展。以下是如何启用pgcrypto
扩展的步骤:
-
登录到PostgreSQL数据库:使用psql命令行工具或你喜欢的数据库管理工具登录到你的PostgreSQL数据库。
-
启用pgcrypto扩展:在psql命令行中,你可以通过以下SQL命令为你的当前数据库启用
pgcrypto
扩展:CREATE EXTENSION IF NOT EXISTS pgcrypto;
这条命令会检查
pgcrypto
扩展是否已经存在,如果不存在,则创建并启用它。IF NOT EXISTS
是可选的,但如果你不确定是否已经启用了扩展,加上它会更安全。 -
使用pg_random_uuid()函数:一旦
pgcrypto
扩展被启用,你就可以在你的SQL查询或PL/pgSQL函数中使用pg_random_uuid()
函数来生成随机UUID了。例如,在psql命令行中,你可以直接执行返回一个新的随机UUID;
SELECT pg_random_uuid();
方法二:定义一个存过函数
CREATE OR REPLACE FUNCTION public.gen_random_uuid()
RETURNS uuid
LANGUAGE c
PARALLEL SAFE
AS '$libdir/pgcrypto', $function$pg_random_uuid$function$;
这条SQL语句是在PostgreSQL数据库中定义或替换一个名为gen_random_uuid
的函数。这个函数的作用是生成一个随机的UUID(Universally Unique Identifier,通用唯一识别码)。下面是对这个语句各部分的详细解释:
CREATE OR REPLACE FUNCTION public.gen_random_uuid()
:CREATE OR REPLACE FUNCTION
: 这部分指示PostgreSQL要么创建一个新的函数(如果该函数名不存在),要么替换掉已存在的同名函数。这非常有用,因为它允许你在不删除旧函数的情况下更新函数的定义。public.gen_random_uuid()
: 指定了函数的名称(gen_random_uuid
)和它的模式(public
),以及它不接受任何参数(括号内为空)。public
是PostgreSQL中的一个默认模式,用于存放数据库对象,如表格、视图、函数等,除非特别指定其他模式。
RETURNS uuid
:- 这部分指明了函数的返回类型,即这个函数将返回一个
uuid
类型的值。UUID是一个128位的数字,通常用32个十六进制数字表示,分成5组由连字符分隔(例如:123e4567-e89b-12d3-a456-426614174000
),用于保证全球范围内的唯一性。
- 这部分指明了函数的返回类型,即这个函数将返回一个
LANGUAGE c
:- 这表示函数是用C语言编写的。实际上,在这个特定的例子中,虽然指定了
LANGUAGE c
,但函数体实际上是通过pgcrypto
模块中的pg_random_uuid
函数实现的,这是一个用C编写的扩展,用于生成随机UUID。
- 这表示函数是用C语言编写的。实际上,在这个特定的例子中,虽然指定了
PARALLEL SAFE
:- 这指定了函数的并行执行安全性。
PARALLEL SAFE
意味着这个函数可以安全地在并行查询中被调用,即它的执行不会依赖于或修改其他并行查询可能访问的数据。这对于确保数据库查询的并行执行性能很重要。
- 这指定了函数的并行执行安全性。
AS '$libdir/pgcrypto', $function$pg_random_uuid$function$
:- 这是函数体的定义部分,但它实际上并没有包含C代码。相反,它指定了函数应该通过调用
pgcrypto
扩展中的pg_random_uuid
函数来实现。$libdir/pgcrypto
指定了pgcrypto
扩展库的路径($libdir
是一个占位符,代表PostgreSQL的库目录),而$function$pg_random_uuid$function$
则是被调用的具体函数名。这种写法是PostgreSQL中调用扩展函数的一种特殊方式。
- 这是函数体的定义部分,但它实际上并没有包含C代码。相反,它指定了函数应该通过调用
综上所述,这条语句定义了一个名为gen_random_uuid
的函数,它使用pgcrypto
扩展的pg_random_uuid
函数来生成一个随机的UUID,并将这个UUID作为函数的返回值。这个函数可以被并行安全地调用。
在psql命令行中,你可以直接执行如下SQL返回一个新的随机UUID;
select lower(replace(gen_random_uuid()::text,'-',''));