数据库约束
1. 约束的基本概念
1.1 什么是约束
约束(Constraint)是用于确保数据库数据的完整性和一致性的规则。约束可以应用于表的列或整个表,用于限制可以存储在表中的数据类型、范围和关系。
1.2 约束的作用
约束的主要作用包括:
- 保证数据完整性:确保数据符合特定的规则和格式
- 保证数据一致性:确保相关表之间的数据关系保持一致
- 防止无效数据:防止插入、更新或删除无效数据
- 提高查询性能:某些约束(如主键、唯一约束)会自动创建索引,提高查询性能
- 简化应用程序逻辑:将数据验证逻辑放在数据库层面,减少应用程序的复杂性
1.3 约束的分类
根据约束的作用范围,约束可以分为:
- 列级约束:应用于单个列的约束
- 表级约束:应用于整个表或多个列的约束
根据约束的类型,约束可以分为:
- 主键约束(PRIMARY KEY)
- 外键约束(FOREIGN KEY)
- 唯一约束(UNIQUE)
- 非空约束(NOT NULL)
- 检查约束(CHECK)
- 默认约束(DEFAULT)
2. 主键约束(PRIMARY KEY)
2.1 主键约束的定义
主键约束用于唯一标识表中的每一行数据,确保表中没有重复的行,并且主键列的值不能为空。
2.2 主键约束的特点
- 每个表只能有一个主键
- 主键列的值必须唯一且不能为空
- 主键可以由单个列或多个列组成(复合主键)
- 主键约束会自动创建唯一索引
2.3 主键约束的语法
2.3.1 列级主键约束
2.3.2 表级主键约束
2.4 主键约束的示例
2.4.1 单列主键
2.4.2 复合主键
3. 外键约束(FOREIGN KEY)
3.1 外键约束的定义
外键约束用于建立表之间的关系,确保一个表中的数据与另一个表中的数据保持一致。外键是一个表中的列或列组合,它引用另一个表的主键或唯一键。
3.2 外键约束的特点
- 外键约束建立了表之间的父子关系
- 外键列的值必须是被引用表中主键或唯一键的有效值,或者是NULL
- 外键约束可以防止无效的跨表数据
- 外键约束支持级联操作(CASCADE)
3.3 外键约束的语法
3.4 外键约束的级联操作
外键约束支持以下级联操作:
操作 | 描述 |
CASCADE | 当被引用表中的行被删除或更新时,自动删除或更新引用表中的对应行 |
SET NULL | 当被引用表中的行被删除或更新时,将引用表中的对应外键列设置为NULL |
SET DEFAULT | 当被引用表中的行被删除或更新时,将引用表中的对应外键列设置为默认值 |
RESTRICT | 当被引用表中的行被删除或更新时,如果引用表中存在对应的引用行,则拒绝删除或更新操作 |
NO ACTION | 与RESTRICT相同,是默认行为 |
3.5 外键约束的示例
4. 唯一约束(UNIQUE)
4.1 唯一约束的定义
唯一约束用于确保表中指定列的值是唯一的,防止重复值。
4.2 唯一约束的特点
- 一个表可以有多个唯一约束
- 唯一约束列的值可以为NULL,但NULL值不视为重复
- 唯一约束会自动创建唯一索引
4.3 唯一约束的语法
4.3.1 列级唯一约束
4.3.2 表级唯一约束
4.4 唯一约束的示例
4.4.1 单列唯一约束
4.4.2 复合唯一约束
5. 非空约束(NOT NULL)
5.1 非空约束的定义
非空约束用于确保表中指定列的值不能为空,必须包含一个有效值。
5.2 非空约束的特点
- 非空约束只能应用于列级
- 非空约束确保列中始终有值
- 非空约束是最基本的数据完整性约束
5.3 非空约束的语法
5.4 非空约束的示例
6. 检查约束(CHECK)
6.1 检查约束的定义
检查约束用于确保表中指定列的值符合特定的条件或范围。
6.2 检查约束的特点
- 检查约束可以应用于列级或表级
- 检查约束可以包含复杂的条件表达式
- 检查约束确保数据符合业务规则
6.3 检查约束的语法
6.3.1 列级检查约束
6.3.2 表级检查约束
6.4 检查约束的示例
6.4.1 列级检查约束
6.4.2 表级检查约束
7. 默认约束(DEFAULT)
7.1 默认约束的定义
默认约束用于为表中指定列设置默认值,当插入数据时如果没有提供该列的值,则使用默认值。
7.2 默认约束的特点
- 默认约束只能应用于列级
- 默认值可以是常量、函数或表达式
- 默认约束确保列中始终有值(除非明确插入NULL)
7.3 默认约束的语法
7.4 默认约束的示例
8. 约束的管理
8.1 添加约束
使用
ALTER TABLE语句可以为已存在的表添加约束。8.1.1 添加主键约束
8.1.2 添加外键约束
8.1.3 添加唯一约束
8.1.4 添加检查约束
8.1.5 添加默认约束
8.1.6 添加非空约束
8.2 删除约束
使用
ALTER TABLE语句可以删除已存在的约束。8.3 查看约束
使用
\d table_name命令可以查看表的结构和约束信息。或使用SQL查询系统视图:
9. 约束的最佳实践
9.1 命名约束
为约束指定有意义的名称,便于管理和维护。默认情况下,数据库会自动生成约束名称,但这些名称通常不直观。
9.2 优先使用表级约束
对于复合约束(如复合主键、复合唯一约束),应优先使用表级约束,使约束定义更加清晰。
9.3 合理使用外键约束
外键约束可以确保表之间的数据一致性,但也会带来一定的性能开销。在设计数据库时,应根据实际需求合理使用外键约束。
9.4 避免过度使用检查约束
检查约束可以确保数据的有效性,但复杂的检查约束会增加数据库的负担。对于复杂的业务规则,应考虑在应用程序层面实现。
9.5 为经常查询的列添加索引
虽然主键约束和唯一约束会自动创建索引,但对于经常查询的其他列,应考虑手动创建索引以提高查询性能。
9.6 考虑约束的性能影响
约束会在插入、更新和删除操作时进行检查,可能会影响数据库的性能。在设计数据库时,应考虑约束的性能影响,特别是对于频繁更新的表。
9.7 定期审查和维护约束
定期审查和维护数据库约束,确保约束仍然符合业务需求,删除不再需要的约束。
10. 示例:综合使用多种约束
11. 小结
本章节介绍了openGauss数据库的各种约束,包括主键约束、外键约束、唯一约束、非空约束、检查约束和默认约束。通过本章节的学习,读者可以了解各种约束的定义、特点、语法和使用场景,掌握约束的管理方法,以及约束的最佳实践。
约束是确保数据库数据完整性和一致性的重要手段,数据库设计人员和开发人员需要熟练掌握各种约束的使用方法,根据实际业务需求合理设计和使用约束。在实际工作中,应遵循命名约束、优先使用表级约束、合理使用外键约束、避免过度使用检查约束等最佳实践,确保数据库的性能和数据完整性。
