3

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

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

3 回答 3

8

保持分开,它们是不同的列。此外,错误消息将显示失败的检查约束名称,您将更好地知道问题出在哪里。未来的开发人员会困惑为什么它们都在一起,或者因为它们在不同的列上而没有注意到它们。

于 2010-03-16T19:22:04.523 回答
0

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

解决批评:出于调试和维护原因(更好的错误、日志记录),您应该做出 3 个限制。插入和更新的性能可能会略有降低,但没什么大不了的。

于 2010-03-16T19:42:14.553 回答
-1

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

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

示例:我有两列BatchId int NULLSuperBatchId int NULL. 然后我的检查约束是

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

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

于 2016-04-09T09:39:18.633 回答