在对关系数据库的设计进行建模时,我们可以设置一些限制,例如允许在关系中插入哪些值,允许在关系中进行什么样的修改和删除。这些是我们对关系数据库施加的限制。
在像 ER 模型这样的模型中,我们没有这样的特征。
数据库中的约束可以分为 3 个主要类别:
- 应用于数据模型的约束称为隐式约束。
- 通过在 DDL(数据定义语言)中指定直接应用于数据模型模式的约束。这些被称为基于模式的约束或显式约束。
- 不能直接应用于数据模型模式的约束。我们称这些为基于应用程序或语义约束。
所以在这里我们将处理隐式约束。
关系型数据库的约束主要有4种类型:
- 域约束
- 关键约束
- 实体完整性约束
- 参照完整性约束
让我们详细讨论上述每个约束。
1. 域约束:
- 每个域都必须包含原子值(最小的不可分割单位),这意味着不允许复合和多值属性。
- 我们在这里执行数据类型检查,这意味着当我们为列分配数据类型时,我们限制了它可以包含的值。例如。如果我们将属性年龄的数据类型指定为 int,我们不能给它除 int 数据类型以外的值。
例子:
解释:
在上面的关系中,Name 是一个复合属性,Phone 是一个多值属性,因此违反了域约束。
2. 关键约束或唯一性约束:
- 这些被称为唯一性约束,因为它确保关系中的每个元组都应该是唯一的。
- 一个关系可以有多个键或候选键(最小超键),其中我们选择其中一个键作为主键,我们对从候选键中选择主键没有任何限制,但建议去具有较少属性数量的候选键。
- 主键中不允许有空值,因此 Not Null 约束也是键约束的一部分。
例子:
解释:
在上表中,EID是主键,第一个和最后一个元组在EID中具有相同的值,即01,因此违反了键约束。
3. 实体完整性约束:
- 实体完整性约束表示没有主键可以采用 NULL 值,因为使用主键我们可以唯一地标识关系中的每个元组。
例子:
解释:
在上面的关系中,EID被设为主键,主键不能取NULL值,但在第三个元组中,主键为空,因此违反了实体完整性约束。
4. 参照完整性约束:
- 参照完整性约束在两个关系或表之间指定,用于维护两个关系中元组之间的一致性。
- 此约束通过外键强制执行,当关系 R1 的外键中的属性与关系 R2 的主键具有相同的域时,则称 R1 的外键引用或引用关系 R1 的主键关系 R2。
- 关系 R1 的元组中的外键值可以采用关系 R2 中某个元组的主键值,也可以采用 NULL 值,但不能为空。
例子:
解释:
上面第一个关系的DNO是外键,第二个关系的DNO是主键。 DNO = 22 在第一个表的外键中是不允许的,因为 DNO = 22
未在第二个关系的主键中定义。因此,这里违反了参照完整性约束