概述


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

注意事项


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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部