当前位置:  首页>> 技术小册>> MySQL从入门到精通(四)

第13章 数据完整性约束

在数据库设计中,数据完整性是确保存储在数据库中的数据准确、可靠且符合业务规则的重要机制。MySQL作为广泛使用的关系型数据库管理系统,提供了多种数据完整性约束来保证数据的正确性和一致性。本章将深入探讨MySQL中的数据完整性约束,包括主键约束、外键约束、唯一约束、检查约束(在较新版本的MySQL中支持)以及默认值与非空约束,旨在帮助读者从理论到实践全面掌握这些关键概念。

13.1 引言

数据完整性约束是数据库设计不可或缺的一部分,它们定义了表中数据的规则,确保数据在添加、修改或删除时遵循这些规则。数据完整性分为四个主要类别:实体完整性、参照完整性、用户定义完整性(包括唯一性和检查约束)以及域完整性(主要通过数据类型、长度等定义)。

13.2 实体完整性

实体完整性通过主键约束实现,确保表中的每一行都是唯一的,能够唯一标识表中的记录。主键可以是单列或多列的组合,但必须满足以下条件:

  • 唯一性:主键列的值在表中必须是唯一的,不允许有重复值。
  • 非空性:主键列的值不能为NULL。

示例

  1. CREATE TABLE Employees (
  2. EmployeeID INT AUTO_INCREMENT,
  3. FirstName VARCHAR(50),
  4. LastName VARCHAR(50),
  5. PRIMARY KEY (EmployeeID)
  6. );

在这个例子中,EmployeeIDEmployees表的主键,保证了每名员工的唯一性,同时因为是自增的,确保了非空性。

13.3 参照完整性

参照完整性通过外键约束实现,用于维护两个表之间的数据一致性。外键是一个表中的字段,它必须是另一个表主键或唯一键的有效值。外键约束确保了数据之间的逻辑关系,防止了孤立的数据记录。

示例

假设有两个表,DepartmentsEmployees,其中Employees表通过DepartmentID字段与Departments表的DepartmentID字段相关联。

  1. CREATE TABLE Departments (
  2. DepartmentID INT AUTO_INCREMENT,
  3. DepartmentName VARCHAR(100),
  4. PRIMARY KEY (DepartmentID)
  5. );
  6. CREATE TABLE Employees (
  7. EmployeeID INT AUTO_INCREMENT,
  8. FirstName VARCHAR(50),
  9. LastName VARCHAR(50),
  10. DepartmentID INT,
  11. PRIMARY KEY (EmployeeID),
  12. FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID)
  13. );

在这个例子中,Employees表的DepartmentID字段是外键,它引用了Departments表的主键DepartmentID,从而确保了每个员工都归属于一个存在的部门。

13.4 唯一约束

唯一约束保证表中某列或列组合的值是唯一的,但允许NULL值(除非另有指定)。唯一约束与主键约束相似,但一个表可以有多个唯一约束,而主键只能有一个。

示例

  1. CREATE TABLE Users (
  2. UserID INT AUTO_INCREMENT,
  3. Email VARCHAR(100),
  4. Username VARCHAR(50),
  5. PRIMARY KEY (UserID),
  6. UNIQUE (Email),
  7. UNIQUE (Username)
  8. );

在这个例子中,EmailUsername列都被设置了唯一约束,确保了用户的邮箱和用户名在表中是唯一的。

13.5 检查约束(MySQL 8.0.16及以上)

检查约束允许你指定一个或多个列中必须满足的条件。如果插入或更新的数据违反了这些条件,操作将被拒绝。在MySQL 8.0.16及更高版本中,检查约束得到了支持。

示例

  1. CREATE TABLE Salaries (
  2. EmployeeID INT,
  3. Salary DECIMAL(10, 2),
  4. CHECK (Salary >= 0),
  5. FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
  6. );

在这个例子中,Salary列被设置了一个检查约束,确保工资值不能小于0。

13.6 默认值与非空约束

  • 默认值:为列指定一个默认值,在插入新记录时,如果该列没有提供值,则使用默认值。
  • 非空约束:要求列在插入或更新记录时必须提供一个值,不能为空(NULL)。

示例

  1. CREATE TABLE Students (
  2. StudentID INT AUTO_INCREMENT,
  3. Name VARCHAR(100) NOT NULL,
  4. Age INT DEFAULT 18,
  5. Enrolled BOOLEAN NOT NULL DEFAULT TRUE,
  6. PRIMARY KEY (StudentID)
  7. );

在这个例子中,NameEnrolled列被设置为非空,而Age列有一个默认值18。

13.7 约束的修改与删除

在数据库设计过程中,可能需要修改或删除已存在的约束。MySQL提供了ALTER TABLE语句来执行这些操作。

  • 添加约束:使用ADD CONSTRAINT子句。
  • 删除约束:使用DROP CONSTRAINT子句(注意,MySQL中直接删除约束的语法可能略有不同,通常是通过修改表结构来间接实现)。
  • 修改约束:通常需要先删除旧约束,然后添加新约束。

13.8 总结

数据完整性约束是数据库设计中保障数据质量的关键手段。通过合理使用主键约束、外键约束、唯一约束、检查约束以及默认值与非空约束,可以有效地维护数据库的实体完整性、参照完整性以及用户定义完整性。在MySQL中,随着版本的更新,对数据完整性的支持也在不断加强,为开发者提供了更丰富的工具和选项来构建高效、可靠的数据库系统。掌握这些约束的使用,对于提升数据库设计质量、保障数据准确性具有重要意义。


该分类下的相关小册推荐: