PostgreSQL 18
PostgreSQL 中的 UUID v7
PostgreSQL 18 可以在 SQL 里生成第 7 版 UUID。更早的版本没有 uuidv7()。说明下面的生成器使用本站其余页面相同的浏览器布局。
生成 UUID
选择版本和数量,然后生成。
uuidv7() 可以带一个可选的 interval 偏移。偏移后的时间仍必须落进 48 位毫秒字段,大约从 1970 年到 10889 年。无限区间会被拒绝。
在同一个后端里,PostgreSQL 18 把 rand_a 的一部分用作亚毫秒分数,这样即使时钟没有往前走,它生成的值仍会前进。uuid_extract_timestamp() 不返回这个分数,它返回的是毫秒字段对应的 timestamptz。
SQL
-- PostgreSQL 18 or newer. uuidv7() is not in PostgreSQL 17.
SELECT uuidv7();
SELECT uuid_extract_version(uuidv7());
SELECT uuid_extract_timestamp(uuidv7());
CREATE TABLE events (
id uuid PRIMARY KEY DEFAULT uuidv7(),
note text NOT NULL
);
常见问题
哪些版本有 uuidv7()?
PostgreSQL 18 加入了 uuidv7()。PostgreSQL 17 及更早版本没有这个函数。gen_random_uuid() 是第 4 版,从 PostgreSQL 13 起在核心里可用。
uuid_extract_timestamp 对 v7 返回什么?
它读取 48 位毫秒字段并返回 timestamptz。如果值不是 RFC 变体,或版本没有受支持的时间戳,它返回 null。它不会还原 PostgreSQL 放在 rand_a 里的亚毫秒分数。
v7 主键一定会让插入更快吗?
时间有序的键常常落在 B-tree 的一侧,这和完全随机的 v4 不同。效果取决于表、索引和工作负载。它不是查询变快的承诺。