Lazy loaded image
06_2_数据库约束
Words 4112Read Time 11 min
2025-12-11

数据库约束

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数据库的各种约束,包括主键约束、外键约束、唯一约束、非空约束、检查约束和默认约束。通过本章节的学习,读者可以了解各种约束的定义、特点、语法和使用场景,掌握约束的管理方法,以及约束的最佳实践。
约束是确保数据库数据完整性和一致性的重要手段,数据库设计人员和开发人员需要熟练掌握各种约束的使用方法,根据实际业务需求合理设计和使用约束。在实际工作中,应遵循命名约束、优先使用表级约束、合理使用外键约束、避免过度使用检查约束等最佳实践,确保数据库的性能和数据完整性。
上一篇
openGauss数据库
下一篇
openGauss数据库
Catalog