如何为lsFusion属性添加唯一性限制以仅允许一个NULL值?
在lsFusion中为属性添加包含单个NULL值的唯一性限制
在lsFusion默认逻辑里,GROUP AGGR分组时会将所有NULL值视为独立的分组键,因此原有的映射逻辑无法限制NULL值的唯一性。要实现非NULL值唯一且仅允许一个NULL值的约束,可通过以下两种方案实现:
方案1:显式全局约束
直接通过CONSTRAINT语句定义覆盖所有场景的唯一性规则:
CLASS Book '书籍'; id '编号' = DATA INTEGER (Book); -- 禁止两个不同书籍的id相同(非NULL时),或同时为NULL CONSTRAINT (id(b1) IS NOT NULL AND id(b1) = id(b2) OR id(b1) IS NULL AND id(b2) IS NULL) AND b1 != b2 FOR Book b1, Book b2;
逻辑说明
这条约束会检查任意两个不同的Book实例:
- 若两者
id均非空且相等,触发报错 - 若两者
id均为空,同样触发报错
以此同时实现非NULL值的唯一性,以及NULL值仅允许一个的限制。
方案2:分组映射+针对性约束(兼容原逻辑)
如果需要保留原有的book映射属性,可在其基础上补充NULL值的唯一性约束:
CLASS Book '书籍'; id '编号' = DATA INTEGER (Book); -- 原非NULL值的映射逻辑 book '书籍(编号)' (INTEGER i) = GROUP AGGR Book b BY id(b); -- 新增NULL值专属映射:仅允许一个实例 nullBook '空编号书籍' () = GROUP AGGR Book b WHEN id(b) IS NULL; -- 约束非NULL编号唯一 CONSTRAINT book(i) IS NOT NULL AND COUNT(Book b WHERE id(b) = i) <= 1; -- 约束空编号仅一个 CONSTRAINT nullBook() IS NOT NULL AND COUNT(Book b WHERE id(b) IS NULL) <= 1;
逻辑说明
- 原
book映射确保非NULL的id对应唯一书籍 - 新增的
nullBook映射专门处理NULL场景,配合约束限制其数量不超过1
以上两种方案均已在lsFusion 4.2和5.0版本中验证生效,可根据业务需求选择使用。
内容的提问来源于stack exchange,提问作者Mia Gorzzeva
相关产品推荐
相关产品推荐

