
22.1 约束
约束(constraint),管理如何插入或处理数据库数据的规则。
DBMS通过在数据库表上施加约束来实施引用完整性。
大多数约束是在表定义中定义的。
22.1.1 主键
主键,用来保证一列(或一组列)的值唯一标识表中的每一行。
有了主键,可以安全地UPDATE或DELETE特定行。
- 任意两行的主键都不相同。
- 每行都具有一个主键值(即列中不允许NULL值)。
- 主键值不能重用。如果从表中删除某一行,其主键值不能分配给新行。
22.1.2 外键
外键是表中的一列,其值必须列在另一表的主键中。
外键有助防止意外删除。在定义外键后,DBMS不允许删除在另一个表中具有关联的行。
有些DBMS支持称为级联删除(cascading delete)的特性。如果启用,该特性在从一个表中删除行时删除所有相关的数据。
22.1.3 唯一约束
唯一约束用来保证一列(或一组列)中的数据时唯一的。
不同于主键,唯一约束列可包含NULL值、可修改或更新、可重复使用、不能用来定义外键。
表可以包含多个唯一约束,但每个表只允许一个主键。
22.1.4 检查约束
检查约束用来保证一列(或一组列)中的数据满足一组指定的条件。
- 检查最大值或最小值
- 指定范围
- 只允许特定的值
检查约束在数据类型内又做了进一步的限制,可以确保数据有效。
有些DBMS允许用户自定义数据类型,可以在定义数据类型时包含检查约束,然后将此数据类型用于表的定义。
22.2 索引
索引用来排序数据以加快搜索和排序操作的速度。
索引必须唯一命名。
可以在一个或多个列上定义索引,使DBMS保存其内容的一个排过序的列表。
DBMS搜索排过序的索引,找出匹配的位置,然后检索这些行。
- 索引改善检索操作的性能,但降低数据操作的性能
- 索引数据可能占用大量存储空间
- 索引适用取值较多的数据过滤和排序
- 索引中可以定义多个列
表数据的变化可能会导致索引难以长时间高效适用,建议定期检查索引并调整。
22.3 触发器
触发器是特殊的存储过程,在特定的数据库活动发生时自动执行。
触发器可以与特定单个表上的INSERT、UPDATE和DELETE操作(或组合)相关联。
常见用途:
- 保证数据一致
- 基于某个表的变动在其他表上执行活动
- 进行额外的验证并根据需要回退数据
- 计算列的值或更新时间戳
不同的DBMS的触发器定义和语法差异巨大。
一般来说,约束的处理比触发器快,建议使用约束。
22.4 数据库安全
任何安全系统的基础都是用户授权和身份确认。
大多数DBMS利用提供给管理员的管理机制授予或限制对数据的访问。
安全性使用SQL的GRANT和REVOKE语句来管理。
大多数DBMS也提供了交互式的管理实用程序。