如何使用现有索引创建条件约束

How to use existing index to create conditional constraint

我有以下索引:

op.create_index(
    op.f("ix_order_company_id_email_lower"),
    "order",
    ["company_id", sa.text("lower(email)")],
    unique=False,
    postgresql_concurrently=True
)

现在我想创建一个检查约束,它将为特定类型的订单创建某种 'unique' 约束。

op.execute(
    """ALTER TABLE order 
        ADD CONSTRAINT check_order_company_id_email_lower_type
        CHECK (type = 'AH01')
        NOT VALID"""
)

如何添加额外检查以仅应用于 ix_order_company_id_email_lower 中的记录?

编辑:基本上这种类型的订单只能在特定公司的每封电子邮件中提交一次。

您需要部分唯一索引:

CREATE INDEX ON order (company_id, lower(email))
WHERE type = 'AH01';