一个检查约束或多个检查约束?

时间:2010-03-16 19:13:56

标签: sql oracle database-design check-constraints

关于是否更少检查约束更好或更多的任何建议?如果有的话,应该如何分组呢?

假设我有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)

3 个答案:

答案 0 :(得分:8)

保持分开,它们是不同的列。此外,错误消息将显示失败的检查约束名称,您将更好地了解问题所在。未来的开发人员会混淆为什么他们在一起,或者因为他们在不同的专栏上而没有注意到它们。

答案 1 :(得分:0)

我建议不要使用varchar。对于人们如何在没有布尔数据类型的数据库中存储布尔值,这不是标准做法。我推荐你最小的整数类型,其中0 = False,非零= True。在这一点上限制变得微不足道(甚至是不必要的)。

解决批评:出于调试和维护原因,你应该制定3个约束(更好的错误,记录)。插入和更新时性能可能略有下降,但没什么大不了的。

答案 2 :(得分:-1)

当列之间存在依赖关系时,您可以将两个列的检查约束一起使用。

有一个例子,当有一个全局id和本地id时,如果你想要这两个条件都不能为空。并且其中任何一个为null或两者都不为null。但是你需要验证其中一个不是null,或者都不是null。

实施例: 我有两列BatchId int NULLSuperBatchId int NULL。然后我的检查约束是

CHECK((BatchId  IS NOT NULL) OR (SuperBatchId  IS NOT NULL))

这是两列检查约束的示例。