关于是否更少检查约束更好或更多的任何建议?如果有的话,应该如何分组呢?
假设我有3列VARCHAR2(1 BYTE)
,每列都是'T'/'F'标志。我想为每个列添加一个检查约束,指定只允许使用字符IN ('T', 'F')
。
我是否应该有3个单独的检查约束,每列一个:
COL_1 IN ('T', 'F')
COL_2 IN ('T', 'F')
COL_3 IN ('T', 'F')
或单一检查约束:
COL_1 IN ('T', 'F') AND COL_2 IN ('T', 'F') AND COL_3 IN ('T', 'F')
我的想法是最好将这三者分开,因为这些列在逻辑上彼此无关。唯一的情况是我会检查一个以上列的检查约束,如果一个值与另一个值之间存在某种关系,例如:
(PARENT_CNT > 0 AND PRIMARY_PARENT IS NOT NULL) OR (PARENT_CNT = 0 AND PRIMARY_PARENT IS NULL)
答案 0 :(得分:8)
保持分开,它们是不同的列。此外,错误消息将显示失败的检查约束名称,您将更好地了解问题所在。未来的开发人员会混淆为什么他们在一起,或者因为他们在不同的专栏上而没有注意到它们。
答案 1 :(得分:0)
我建议不要使用varchar。对于人们如何在没有布尔数据类型的数据库中存储布尔值,这不是标准做法。我推荐你最小的整数类型,其中0 = False,非零= True。在这一点上限制变得微不足道(甚至是不必要的)。
解决批评:出于调试和维护原因,你应该制定3个约束(更好的错误,记录)。插入和更新时性能可能略有下降,但没什么大不了的。
答案 2 :(得分:-1)
当列之间存在依赖关系时,您可以将两个列的检查约束一起使用。
有一个例子,当有一个全局id和本地id时,如果你想要这两个条件都不能为空。并且其中任何一个为null或两者都不为null。但是你需要验证其中一个不是null,或者都不是null。
实施例:
我有两列BatchId int NULL
和SuperBatchId int NULL
。然后我的检查约束是
CHECK((BatchId IS NOT NULL) OR (SuperBatchId IS NOT NULL))
这是两列检查约束的示例。