UUID 函数
UUID 是 128 位标识符,适合跨系统生成标识,但“唯一”仍是概率或生成策略保证,并不能代替数据库的主键约束。以下以 PostgreSQL 为准;可用函数随服务器版本变化。
生成与存储
CREATE TABLE events (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
name text NOT NULL
);
SELECT gen_random_uuid(); -- 生成随机的 UUID v4
uuid 列使用二进制 UUID 类型,通常比存储 36 字符的 text 更合适。gen_random_uuid() 在现代 PostgreSQL 中内置;较旧版本可能需要 pgcrypto 扩展。v4 基于随机数,插入 B-tree 索引的位置较分散。
版本与时间
支持 UUID v7 的 PostgreSQL 版本提供 uuidv7(),其高位包含毫秒级时间信息,通常更利于按生成时间的索引局部性;它仍不是严格单调的数据库序列,也不能直接用作审计时间。支持该版本函数时可检查:
SELECT uuid_extract_version(uuidv7()); -- 7
SELECT uuid_extract_timestamp(uuidv7()); -- 从支持的时间型 UUID 提取时间
uuid_extract_version、uuid_extract_timestamp 与 uuidv7 并非所有部署版本都具备;运行示例前先核对服务器版本。任意 UUID(例如 v4)都没有可提取的可靠创建时间。需要准确发生时间时,另存 timestamptz 列。
选择原则
应用生成 UUID 可减少依赖数据库取号,但必须正确使用安全的生成器。不要从 UUID 猜业务顺序、权限或真实性;主键/唯一约束仍需保留,展示时也不要把 UUID 当作秘密令牌。