根据其他字段的组合限制数据库字段值

时间:2012-03-07 04:41:05

标签: database

我的任务是构建一个简单的数据库,以便在我的工作中保存有关IT基础架构的信息。

我对数据库知之甚少,但它并不重要,它只会由我的团队使用。我不能详细说明,因为它们是保密的,也有些技术性,因此我将使用一个简单的类比。

假设我需要建立一个数据库,其中包含动物收容所中各种动物的信息。出于类比的目的,每只动物可以很容易地将所有信息保存在单个表中而没有冗余。该表的字段可以是,例如,

ANIMAL_ID, ANIMAL_NAME, SPECIES, NUMBER_LEGS, NUMBER_TOES...(请耐心等待我。)

现在,让我们说这个避难所只保留two species, dogs and birds。显然,您可以限制NUMBER_LEGS仅接受来自0-4的值。然而,

就鸟类而言,它们永远不会超过两条腿

同样地,只有一条腿(另一条被狗咬过)的鸟只有最多3个脚趾而不是通常的6个(而狗可能有1到20个脚趾的东西) )

我计划在将访问此数据的程序的应用程序(甚至表示)层对此进行限制。它将采取决策树的形式

(例如choose animal, then choose number of legs, then number toes, etc)。但是,我想知道是否:

A)如果通常在数据级别强制执行这些约束,那么数据库就不可能保留,例如

一条有三条腿的鸟,或一条有20个脚趾的三条腿狗

B)如果A为真,我将如何在通用关系数据库中执行此操作?

(请注意,虽然脚趾数量和爪子数量都是数字字段,但实际情况并非总是如此。我可能需要一组特定属性(比如ANIMAL_COLOUR),尽可能值为BLACK, BLUE, RED, PURPLE, BRINDLE等。但是则DOG不能具有COLOR值PURPLE ;同时 BIRD可以是PURPLE或BLUE但不是BRINDLE 。)

1 个答案:

答案 0 :(得分:1)

他们被称为check constraints。 Oracle的一个例子是:

create table ANIMALS
(
  ANIMAL_ID     number
 ,ANIMAL_NAME   varchar2(100)
 ,SPECIES       varchar2(100)
 ,NUMBER_LEGS   number
 ,NUMBER_TOES   number
 ,constraint NUM_TOES_CK check(NUMBER_TOES <= NUMBER_LEGS * 3)
)