---

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_centsamount 一致
  • 索引命中: 过滤派生字段时命中表达式索引
  • 事务一致: 写入失败不产生部分数据

注意事项

  • 生成列为存储派生, 修改表达式需谨慎
  • 约束错误需清晰可见以便客户端处理
  • 数值与精度需根据业务场景选择
  • 与分区与统计协同优化

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部