如何在PostgreSQL中设置NAND约束
你需要的NAND逻辑对应到字段约束的规则是:禁止两个字段同时非空,允许都为空、仅单个字段有值,对应的CHECK约束有两种等价的实现写法:
第一种是直接对应语义的直观写法,明确表达“不能同时不为空”的规则:
ALTER TABLE foo ADD CONSTRAINT check_status CHECK (NOT (refused_at IS NOT NULL AND requested_at IS NOT NULL));
第二种是经德摩根定律转换后的等价写法,可读性同样很高:
ALTER TABLE foo ADD CONSTRAINT check_status CHECK (refused_at IS NULL OR requested_at IS NULL);
你之前写的(refused_at IS NULL) <> (requested_at IS NULL)属于异或逻辑,要求两个字段的空值状态必须不同,也就是必须恰好有一个字段非空,不允许两个都为空的情况,因此不符合你需要的NAND规则。
内容的提问来源于stack exchange,提问作者DevonDahon
相关产品推荐
相关产品推荐

