如何在GraphQL FaunaDB中通过Schema为多字段创建联合唯一索引
解决FaunaDB GraphQL Schema中联合唯一约束的问题
你遇到的问题其实是对@unique注解的用法理解有点偏差——直接给两个字段都加@unique(index: "...")是行不通的,因为@unique默认是针对单个字段的约束,这种写法只会让第一个字段(也就是promo)关联到你指定的索引,第二个字段不会被纳入联合唯一性检查。
要实现promo和variable的联合唯一约束,你需要先定义一个联合唯一索引,再把它和你的实体类型关联起来,具体有两种写法:
方法一:显式定义联合索引 + 实体类型
# 第一步:创建联合唯一索引,指定要联合的两个字段,并开启unique属性 index unique_promo_variable { source: PromoTemplateVariable terms: [ { field: ["data", "promo"] }, { field: ["data", "variable"] } ] unique: true } # 第二步:定义实体类型,确保两个关联字段为必填项即可,无需再给单个字段加@unique type PromoTemplateVariable { promo: Promo! variable: TemplateVariable! value: String! }
方法二:类型级别绑定联合索引(更简洁)
# 先定义实体类型,用@unique注解绑定到后续的联合索引 type PromoTemplateVariable @unique(index: "unique_promo_variable") { promo: Promo! variable: TemplateVariable! value: String! } # 再定义对应的联合唯一索引 index unique_promo_variable { source: PromoTemplateVariable terms: [ { field: ["data", "promo"] }, { field: ["data", "variable"] } ] unique: true }
注意事项
- 部署这个Schema之前,如果你已经在FaunaDB里创建了只包含
promo字段的旧索引,一定要先删除它,避免新旧索引冲突导致部署失败。 - 当你部署成功后,
unique_promo_variable索引会强制promo和variable的组合值唯一,任何重复的组合都会被FaunaDB拒绝。
内容的提问来源于stack exchange,提问作者Lenik
相关产品推荐
相关产品推荐

