---
title: PostgreSQL 生成列与写时校验(Generated Column、CHECK 与验证)
date: 2025-11-26
keywords:
- 生成列
- CHECK
- 表约束
- 表达式索引
- 验证
description: 使用生成列与CHECK约束在写时进行校验与派生存储,结合表达式索引提升查询效率,并提供一致性验证方法。
tags:
- CHECK
- PostgreSQL
- 数据与存储
- 数据库
- 生成列
- 表约束
- 表达式索引
- 验证
categories:
- 文章资讯
- 编程技术
---
概述
生成列在写入时自动派生值,CHECK约束确保数据符合规则。结合表达式索引可加速派生字段的查询与过滤,实现一致且高效的数据模型。
关键实践与参数
- 生成列: 使用
GENERATED ALWAYS AS定义派生字段 - 校验规则: 使用
CHECK保证数据范围与格式 - 索引: 对派生表达式建立索引
- 事务一致: 在同一事务内写入与校验原子化
示例/配置/实现
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
amount NUMERIC(12,2) NOT NULL,
currency TEXT NOT NULL,
amount_cents BIGINT GENERATED ALWAYS AS ((amount * 100)::BIGINT) STORED,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
CHECK (amount >= 0),
CHECK (currency IN ('CNY','USD','EUR'))
);
CREATE INDEX idx_orders_amount_cents ON orders (amount_cents);
INSERT INTO orders(amount, currency) VALUES (12.34, 'CNY');
SELECT id, amount_cents FROM orders WHERE amount_cents >= 1000;
验证
- 写时校验: 插入非法金额或不支持币种被拒绝
- 派生正确:
amount_cents与amount一致 - 索引命中: 过滤派生字段时命中表达式索引
- 事务一致: 写入失败不产生部分数据
注意事项
- 生成列为存储派生, 修改表达式需谨慎
- 约束错误需清晰可见以便客户端处理
- 数值与精度需根据业务场景选择
- 与分区与统计协同优化

发表评论 取消回复