主键与外键

 数据库   ZeroIsStart   2024-10-20 09:54   41

SQL Server 主键与外键:创建主键和外键的详细指南

在关系型数据库中,主键(Primary Key)和外键(Foreign Key)是确保数据一致性和完整性的重要工具。主键用于唯一标识表中的每一行,而外键则用于在两个表之间建立关系,确保引用的完整性。在 SQL Server 中,主键和外键可以通过 ALTER TABLE 语句来创建。本文将详细介绍如何在 SQL Server 中创建和管理主键和外键,并结合示例代码,展示如何实际应用这些概念。


1. 主键(Primary Key)概述

主键是表中用来唯一标识记录的字段。一个表只能有一个主键,主键中的每个值必须是唯一的,并且不能包含空值(NULL)。主键通常由一个或多个字段组合而成。在 SQL Server 中,创建主键时,可以使用 ALTER TABLE 语句添加主键约束。

1.1 创建主键的基本语法

ALTER TABLE 表名 
ADD CONSTRAINT 主键约束名称 PRIMARY KEY (列名);
  • 表名:要添加主键的表。
  • 主键约束名称:为主键约束指定的名称。
  • 列名:用作主键的列。可以是单列或多列(复合主键)。

1.2 创建单列主键的示例

假设我们有一个 Employees 表,需要使用 EmployeeID 列作为主键。可以使用以下语句:

ALTER TABLE Employees 
ADD CONSTRAINT PK_EmployeeID PRIMARY KEY (EmployeeID);

解释:

  • PK_EmployeeID 是主键约束的名称。
  • EmployeeID 是作为主键的列。

1.3 创建复合主键的示例

如果要使用多个字段作为主键,可以创建复合主键。例如,假设 Orders 表的 OrderIDProductID 列一起构成复合主键,可以使用以下语句:

ALTER TABLE OrderDetails 
ADD CONSTRAINT PK_OrderProduct PRIMARY KEY (OrderID, ProductID);

解释:

  • PK_OrderProduct 是复合主键的名称。
  • OrderIDProductID 共同构成主键。

1.4 主键的特性

  • 主键自动创建一个唯一索引,用于确保主键字段的唯一性。
  • 主键列不允许包含 NULL 值,必须提供有效数据。
  • 主键约束可以是单列或多列(复合主键)。

2. 外键(Foreign Key)概述

外键是一种约束,用于在表与表之间建立联系。外键约束确保了一个表中的值在另一个表中也有相应的值,从而保证了数据的完整性。外键通常用于实现一对多的关系。

2.1 创建外键的基本语法

ALTER TABLE 子表名 
ADD CONSTRAINT 外键约束名称 FOREIGN KEY (子表列) 
REFERENCES 父表名 (父表列);
  • 子表名:包含外键的表。
  • 外键约束名称:为外键约束指定的名称。
  • 子表列:在子表中作为外键的列。
  • 父表名:引用的父表。
  • 父表列:父表中的列,外键指向该列。

2.2 创建外键的示例

假设我们有一个 Employees 表和一个 Departments 表,我们希望在 Employees 表中创建一个外键 DepartmentID,该外键指向 Departments 表中的 DepartmentID 列。可以使用以下语句:

ALTER TABLE Employees 
ADD CONSTRAINT FK_Department FOREIGN KEY (DepartmentID) 
REFERENCES Departments (DepartmentID);

解释:

  • FK_Department 是外键约束的名称。
  • DepartmentIDEmployees 表中的外键列。
  • Departments 表中的 DepartmentID 列是被引用的主键。

2.3 外键的特性

  • 外键约束确保引用的完整性。即当一个表的外键列指向另一个表的主键时,只有在主表中存在该主键值时,子表中的外键才有效。
  • 外键可以限制删除和更新操作的行为。可以通过指定 ON DELETEON UPDATE 选项来控制删除和更新时外键约束的行为。

3. 外键的删除和更新规则

在 SQL Server 中,外键约束有三种主要的删除和更新行为:

  • CASCADE:当父表中的记录删除或更新时,子表中的相关记录也会自动删除或更新。
  • SET NULL:当父表中的记录删除或更新时,子表中的外键字段将被设置为 NULL
  • NO ACTION:当父表中的记录删除或更新时,外键约束会阻止操作,保持数据完整性。

3.1 示例:使用 ON DELETE CASCADEON UPDATE CASCADE

ALTER TABLE Employees 
ADD CONSTRAINT FK_Department 
FOREIGN KEY (DepartmentID) 
REFERENCES Departments (DepartmentID)
ON DELETE CASCADE
ON UPDATE CASCADE;

解释:

  • Departments 表中的记录被删除时,Employees 表中所有引用该部门的员工记录也会被自动删除(ON DELETE CASCADE)。
  • Departments 表中的 DepartmentID 更新时,Employees 表中所有引用该部门的记录也会自动更新(ON UPDATE CASCADE)。

3.2 示例:使用 ON DELETE SET NULL

ALTER TABLE Employees 
ADD CONSTRAINT FK_Department 
FOREIGN KEY (DepartmentID) 
REFERENCES Departments (DepartmentID)
ON DELETE SET NULL;

解释:

  • Departments 表中的记录被删除时,Employees 表中的 DepartmentID 列将被设置为 NULLON DELETE SET NULL),但不会删除员工记录。

4. 删除和修改外键

如果需要删除或修改外键,可以使用以下语法:

4.1 删除外键

ALTER TABLE 子表名 DROP CONSTRAINT 外键约束名称;

示例:

ALTER TABLE Employees DROP CONSTRAINT FK_Department;

4.2 修改外键

要修改外键,首先需要删除旧的外键约束,然后重新添加新的外键约束。

ALTER TABLE Employees DROP CONSTRAINT FK_Department;

ALTER TABLE Employees 
ADD CONSTRAINT FK_Department 
FOREIGN KEY (DepartmentID) 
REFERENCES Departments (DepartmentID)
ON DELETE CASCADE;

5. 主键与外键的应用场景

主键和外键在实际应用中扮演着至关重要的角色,尤其是在设计和管理关系型数据库时。

5.1 确保数据一致性

主键确保表中每一行数据的唯一性,而外键则确保不同表之间的引用关系是有效的。通过主键和外键约束,可以确保数据库中的数据始终保持一致。

5.2 实现数据完整性

外键约束帮助维护表与表之间的关联完整性。例如,在订单管理系统中,OrderDetails 表中的外键列可以指向 Orders 表的主键列,从而确保每个订单项都属于一个有效的订单。

5.3 降低冗余

通过使用外键,可以避免数据的冗余。例如,Employees 表中的 DepartmentID 外键指向 Departments 表的主键,而不是在每个员工记录中存储部门的详细信息。


6. 总结

主键和外键是关系型数据库设计中至关重要的约束。通过创建主键和外键,SQL Server 帮助开发人员确保数据的唯一性和引用完整性。本文介绍了如何在 SQL Server 中创建和管理主键与外键,涵盖了相关的语法、示例以及如何使用外键的删除和更新规则。在实际的数据库设计中,合理使用主键和外键可以显著提高数据的一致性和可靠性。希望你能在实际项目中运用这些知识来构建更加健壮的数据模型。