跳到主要内容

PostgreSQL UUID 与 ENUM 教程

UUID 提供全局唯一标识,适合分布式主键和对外暴露的 ID;ENUM 创建受控的取值集合,比 TEXT + CHECK 更紧凑。

本篇内容​

  • UUID 类型与生成函数
  • UUID 做主键的取舍
  • ENUM 类型的创建与修改
  • ENUM vs 外键表 vs TEXT + CHECK

UUID​

-- PostgreSQL 13+ 内置,无需扩展
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(50) NOT NULL
);

INSERT INTO users (name) VALUES ('Jack') RETURNING id;

-- 字符串与 UUID 互转
SELECT '550e8400-e29b-41d4-a716-446655440000'::UUID;
SELECT id::TEXT FROM users;

ENUM​

-- 创建枚举类型
CREATE TYPE order_status AS ENUM ('pending', 'paid', 'shipped', 'cancelled');

CREATE TABLE orders (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
status order_status NOT NULL DEFAULT 'pending'
);

-- 比较按定义顺序
SELECT * FROM orders WHERE status = 'paid';
SELECT * FROM orders WHERE status > 'paid'; -- shipped / cancelled

-- 修改枚举(可加值;删值/改序需要重建类型)
ALTER TYPE order_status ADD VALUE 'refunded';
待补充(TODO)
  • 补充:UUID 版本差异(v4 随机 / v7 时间序)与索引局部性
  • 补充:UUID 存储开销(16 字节)与主键选型建议表
  • 补充:ENUM 的增删值限制(ADD VALUE 不能在事务中回滚的注意事项)
  • 补充:ENUM 改外键表的迁移方案