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 改外键表的迁移方案