这个主题的后来变体是为替代类型的 UUID 开发的。有些人可能不想记录服务器的实际 MAC 地址,例如出于安全或隐私考虑。Postgres 扩展生成五种 UUID,外加“nil” UUID 00000000-0000-0000-0000-000000000000。
UUID 作为默认值
该方法调用可以自动为任何新插入的行生成默认值。定义列时,请指定:
DEFAULT uuid_generate_v1()
请参阅以下示例表定义中使用的命令。
CREATE TABLE public.pet_
(
species_ text NOT NULL,
name_ text NOT NULL,
date_of_birth_ text NOT NULL,
uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(), -- <====
CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.pet_
OWNER TO postgres;
uuid_generate_v1() 包含当前计算机的MAC 地址+ 当前时刻。常用,但如果您对披露数据库服务器的 MAC 或生成此值的时间敏感,请避免使用。由规范定义为版本 1 UUID。
uuid_generate_v1mc() 与版本 1类似,但使用随机多播 MAC 地址而不是真实 MAC 地址。显然是一种使用版本 1 的方法,但如果您对披露该事实很敏感,请替换另一个 MAC 而不是数据库服务器的实际 MAC。 什么是“随机多播 MAC”?我不知道确切。在阅读了RFC 4122的第 4.1.6 节之后,我怀疑这是一个用于代替 MAC 的随机数,但其位设置为指示多播 MAC 地址而不是通常的单播,以便将版本 1 的这种变体与通常的真实 MAC 版本 1 UUID。
uuid_generate_v3( namespace uuid, name text ) 包含您提供的文本的MD5哈希值。由规范定义为版本 3 UUID,基于命名空间的 UUID。
tl;博士
DEFAULT
在定义列以调用 OSSP uuid 函数之一时调用。每次插入一行时,Postgres 服务器都会自动调用该函数。如果您已经使用pgcrypto扩展,请考虑bpieck 的答案。
生成 UUID 所需的插件
虽然Postgres开箱即用支持以原生128 位形式存储 UUID(通用唯一标识符)值,但生成UUID 值需要插件。在 Postgres 中,插件称为.
extension
要安装扩展程序,请调用
CREATE EXTENSION
。为避免重新安装,请添加IF NOT EXISTS
. 有关更多详细信息,请参阅我的博客文章,或在 StackOverflow 中查看此页面。我们想要的扩展是一个用 C 语言构建的开源库,用于处理 UUID,OSSP uuid。这个 Postgres 库的构建通常与 Postgres 的安装捆绑在一起,例如Enterprise DB提供的图形安装程序,或Amazon RDS for PostgreSQL等云提供商包含的图形安装程序。
生成各种 UUID
请参阅扩展程序的文档以查看提供用于生成各种 UUID 值的多个命令的列表。要获取由计算机的MAC 地址加上当前日期时间加上一个小的随机值构建的 UUID 的原始版本,请调用
uuid_generate_v1()
.这个主题的后来变体是为替代类型的 UUID 开发的。有些人可能不想记录服务器的实际 MAC 地址,例如出于安全或隐私考虑。Postgres 扩展生成五种 UUID,外加“nil” UUID
00000000-0000-0000-0000-000000000000
。UUID 作为默认值
该方法调用可以自动为任何新插入的行生成默认值。定义列时,请指定:
请参阅以下示例表定义中使用的命令。
UUID 版本
uuid-ossp插件可以生成各种版本的UUID 。
uuid_generate_v1()
包含当前计算机的MAC 地址+ 当前时刻。常用,但如果您对披露数据库服务器的 MAC 或生成此值的时间敏感,请避免使用。由规范定义为版本 1 UUID。
uuid_generate_v1mc()
与版本 1类似,但使用随机多播 MAC 地址而不是真实 MAC 地址。显然是一种使用版本 1 的方法,但如果您对披露该事实很敏感,请替换另一个 MAC 而不是数据库服务器的实际 MAC。
什么是“随机多播 MAC”?我不知道确切。在阅读了RFC 4122的第 4.1.6 节之后,我怀疑这是一个用于代替 MAC 的随机数,但其位设置为指示多播 MAC 地址而不是通常的单播,以便将版本 1 的这种变体与通常的真实 MAC 版本 1 UUID。
uuid_generate_v3( namespace uuid, name text )
包含您提供的文本的MD5 哈希值。由规范定义为版本 3 UUID,基于命名空间的 UUID。
uuid_generate_v4()
基于 128 位中的 121-122 位随机生成的数据。六位或七位用于指示版本和变体。这种 UUID 仅在使用加密强的随机生成器实现时才实用。由规范定义为版本 4 UUID。
uuid_generate_v5( namespace uuid, name text )
与版本 3 相同,但使用SHA1散列。由规范定义为版本 5 UUID。
uuid_nil()
一种特殊情况,所有位都设置为零
00000000-0000-0000-0000-000000000000
。用作未知 UUID 值的标志。称为nil UUID。要比较类型,请参阅问题,要使用哪个 UUID 版本?
如果您只对版本 4(随机生成)感兴趣,并且已经在使用pgcrypto,请参阅 bpieck 的答案。
如果您对版本 3 和 5 感到好奇,请参阅此问题,生成 v5 UUID。什么是名称和命名空间?.
有关更多讨论,请参阅我对类似问题的回答和我的博客文章UUID 值从 JDBC 到 Postgres。
pgcrypto扩展
只是对 Basil 非常详细的答案的一个小补充。
由于目前大多数人都在使用pgcrypto,
uuid_generate_v4()
因此您可以使用gen_random_uuid()
版本4 UUID值来代替。首先,在 Postgres 中启用pgcrypto。
只需将列的 DEFAULT 设置为
如果使用 Postgres 14 或更新版本,您不需要任何修改或额外插件,只需使用
gen_random_uuid()
刚刚在使用 Postgres v14 的默认 AWS Aurora Serverless v2 上进行了测试
ps 你可以看到我的默认 id 实际上是带前缀
wor-
的,而它是工作区 id。我为所有表添加前缀,因此当我从任何地方获取 ID 时 - 日志、支持等。我可以准确地知道要搜索的内容。concat('wor-', gen_random_uuid())