如何基于现有索引为特定类型订单创建条件唯一性约束
核心误区说明
你当前编写的CHECK约束无法实现跨记录的唯一性校验,CHECK约束只能验证单条行记录内的字段规则,不能判断是否存在其他符合重复条件的记录,你的需求可以直接用PostgreSQL的部分唯一索引实现,不需要单独写CHECK约束。
实现方案
你要的「仅type为AH01的订单,同公司、同小写邮箱仅可提交一次」的需求,直接创建带过滤条件的唯一索引即可,写法如下:
Alembic 迁移代码
op.create_index( op.f("ix_order_company_id_email_lower_ah01_unique"), "order", ["company_id", sa.text("lower(email)")], unique=True, postgresql_concurrently=True, # 仅对type为AH01的记录生效唯一校验 postgresql_where=sa.text("type = 'AH01'") )
对应的原生SQL逻辑
CREATE UNIQUE INDEX ix_order_company_id_email_lower_ah01_unique ON "order" (company_id, lower(email)) WHERE type = 'AH01';
逻辑说明
这个唯一索引只会把type = 'AH01'的记录纳入唯一校验范围,其他类型的订单不会被该索引约束,完全匹配你的需求。如果你的原有普通索引ix_order_company_id_email_lower没有其他业务场景使用,可以直接删除。
内容的提问来源于stack exchange,提问作者Vedran Omeragic
相关产品推荐
相关产品推荐

