(v13+))
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载导读本文讲解如何在 PostgreSQL 中不安装任何扩展就能生成随机的 v4 UUID。自 PostgreSQL v13 起gen_random_uuid()函数已被内置进数据库核心无需再创建uuid-ossp或pgcrypto扩展即可直接调用。读完本文你将掌握gen_random_uuid()的用法、版本前提、与旧方案uuid_generate_v4()、pgcrypto的演进关系以及在建表默认值、ALTER TABLE类型转换等实战场景中的落地方式并了解何时仍必须依赖uuid-ossp扩展。背景PostgreSQL 中 UUID 生成的演进在本仓库的 TIL 系列中先后记录了几种在 PostgreSQL 里生成 UUID 的方式最早的方法是通过uuid-ossp扩展 提供的uuid_generate_v4()函数生成完全基于随机数的 v4 UUID使用前需要先执行create extension uuid-ossp;。后来官方文档指出 OSSP UUID 库“维护不佳、移植难度日益增加”并建议“如果只需要随机生成的版本 4UUID考虑改用 pgcrypto 模块中的gen_random_uuid()函数”即pgcrypto扩展 提供的同名函数使用前同样需要create extension pgcrypto;。两条旧路线都依赖扩展模块涉及扩展的安装与权限管理。而从 PostgreSQL v13 开始情况发生了变化。核心内容v13 起 gen_random_uuid() 成为内置函数从 PostgreSQL v13 开始生成 v4 UUID 不再需要添加任何扩展——gen_random_uuid()函数直接内置在数据库核心中开箱即用。 select gen_random_uuid(); gen_random_uuid -------------------------------------- 0aa72fe6-ede7-4ccf-b328-348becc58066 (1 row)无需任何CREATE EXTENSION前置步骤直接select即可获得一个标准的 v4 UUID。每次调用都会生成全新的随机值例如再次执行会得到截然不同的结果 select gen_random_uuid(); gen_random_uuid -------------------------------------- 8e5f1c7a-2b4d-4a9e-b0c3-1d6f9a2e7b44 (1 row)版本前提确认gen_random_uuid()作为内置函数是 v13 引入的能力。在开发或运维时建议先确认当前集群版本可用本仓库记录的check-postgres-version思路在 Docker 容器中或直接执行版本查询来验证select version();若你的环境仍运行在 PostgreSQL 12 及更早版本gen_random_uuid()不可用此时应退回pgcrypto扩展先create extension pgcrypto;或uuid-ossp扩展 的方案。实战应用把 gen_random_uuid() 用进表结构与迁移内置函数最常见的价值是作为uuid类型列的主键默认值让插入时自动生成随机主键无需应用层传值create table books ( id uuid primary key default gen_random_uuid(), title text not null, author text not null, created_at timestamptz not null default now(), updated_at timestamptz not null default now() );配合本仓库中关于现代主键列设计的思路serial已不推荐整数主键应使用generated always as identityUUID 主键方案可以在建表时与gen_random_uuid()默认值组合使用。gen_random_uuid()也可以出现在ALTER TABLE中。当需要把不可直接转换的列类型如int→uuid改造成 UUID 时PostgreSQL 无法自动完成转换必须借助using子句指定转换逻辑本仓库在switch-non-castable-column-type-with-using-clause中有完整记录alter table users alter column id set data type uuid using (gen_random_uuid());这里的using (gen_random_uuid())告诉 PostgreSQL忽略原来整型id的值改用gen_random_uuid()生成的随机 UUID 填充该列。ORM 侧的使用佐证本仓库的 Rails 笔记也印证了这一内置函数的实际应用columns-with-default-values-are-nil-on-create记录了 Rails 项目中uuid类型列直接以gen_random_uuid()作为数据库层默认值的行为query-a-single-value-from-the-database展示了通过select gen_random_uuid()语句从应用侧直接取一个 UUIDdifferent-ways-to-add-a-foreign-key-reference等迁移笔记展示了type: :uuid的外键引用写法其前提正是主键表使用uuid类型并依赖gen_random_uuid()之类的默认值生成。何时仍需要 uuid-ossp 扩展gen_random_uuid()只解决随机v4UUID的生成。如果你还需要其他非 v4 版本的 UUID 函数比如基于命名空间与名称的确定性 UUID如uuid_generate_v3(namespace, name)、uuid_generate_v5(namespace, name)以及uuid_nil()、uuid_ns_dns()等就仍然得安装并依赖uuid-ossp扩展create extension uuid-ossp; select uuid_generate_v4(); -- v4 随机 UUID select uuid_generate_v5(namespace, name); -- v5 命名空间 UUIDgen_random_uuid() 无法替代仓库中install-postgres-with-uuid-ossp-using-asdf还记录了通过 asdf 安装含uuid-ossp的 PostgreSQL 的注意事项供确有需要时参考。三种方案速查方案是否需要扩展生成类型适用版本uuid_generate_v4()uuid-ossp需要create extension uuid-ossp;v4 随机 UUID且提供 v3/v5 等更多函数所有版本gen_random_uuid()pgcrypto需要create extension pgcrypto;v4 随机 UUIDv12 及更早版本gen_random_uuid()内置不需要任何扩展v4 随机 UUIDv13 及以上选择建议运行在 v13 且只需随机 UUID 时直接使用内置gen_random_uuid()免去扩展安装与权限维护只有需要非 v4 的 UUID 语义时才退回uuid-ossp。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐使用pgrx从Rust生成PostgreSQL扩展SQL使用pgrx从Rust生成PostgreSQL扩展SQL 痛点传统PostgreSQL扩展开发的困境 你还在为PostgreSQL扩展开发中的繁琐SQL生成而数据库后端开发工具Laravel-ACL完全指南为Laravel 6打造轻量级角色权限系统 Laravel ACL完全指南为Laravel 6打造轻量级角色权限系统 你是否正在为Laravel应用寻找一个简单高效的权限管理系统 Larave【免费下载】 DuckDB PostgreSQL扩展pg_duckdb 使用教程DuckDB PostgreSQL扩展pg_duckdb 使用教程 1. 项目介绍 pg_duckdb 是一个为 PostgreSQL 提供的扩展它将 Du创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考