SQL - 外键:在表之间建立关系

你好,有抱负的数据库爱好者们!今天,我们将踏上一段激动人心的旅程,探索 SQL 外键的世界。作为你友好的计算机老师邻居,我在这里引导你了解这个构成关系型数据库脊梁的关键概念。所以,拿起你的虚拟记事本,让我们一起深入研究!

SQL - Foreign Key

SQL 外键:连接点

想象你正在组织一个巨大的图书馆。你有一个书架放书,另一个放作者。如果你能够某种方式将每本书与它的作者联系起来,而不必在每本书上写下作者的详细信息,那岂不是很好?这正是 SQL 中的外键所做的!

什么是外键?

外键是一个表中的一个列(或多个列),它引用另一个表中的主键。它就像是两个表之间的桥梁,建立了它们之间的关系。

让我们来看一个简单的例子:

CREATE TABLE Authors (
AuthorID INT PRIMARY KEY,
AuthorName VARCHAR(100)
);

CREATE TABLE Books (
BookID INT PRIMARY KEY,
Title VARCHAR(200),
AuthorID INT,
FOREIGN KEY (AuthorID) REFERENCES Authors(AuthorID)
);

在这个例子中,Books 表中的 AuthorID 是一个外键,它引用了 Authors 表中的 AuthorID。这意味着每本书都链接到了一个作者,但我们不需要为每本书重复所有的作者信息。

为什么使用外键?

  1. 数据完整性:外键确保你不能添加一个不存在作者的书籍。
  2. 关系:它们允许你在表之间创建有意义的关系。
  3. 效率:你可以存储一次数据并多次引用它,节省空间并减少冗余。

在现有列上添加外键约束

有时,你可能想要在现有列上添加外键约束。别担心,SQL 会帮助你!以下是如何操作的:

ALTER TABLE Books
ADD CONSTRAINT FK_AuthorID
FOREIGN KEY (AuthorID) REFERENCES Authors(AuthorID);

这个命令将外键约束添加到 Books 表中现有的 AuthorID 列。我们将约束命名为 FK_AuthorID - 给你的约束起有意义的名字总是一个好习惯。

谨慎提示

在将外键约束添加到现有列之前,请确保该列中的所有值在引用表中都有对应的值。否则,SQL 会抛出错误!

删除外键:分手并不难

有时,关系会发生变化,你可能需要移除外键约束。以下是如何操作的:

ALTER TABLE Books
DROP FOREIGN KEY FK_AuthorID;

这个命令移除了我们之前添加的外键约束。记住,这不会删除列或其数据 - 它只是移除了表之间的关系。

主键与外键:动态二人组

将主键和外键视为数据库世界中的动态二人组。他们各有角色,但一起工作时效果最佳。让我们来分析一下:

主键

  • 唯一标识表中的每条记录
  • 必须包含唯一值,且不能包含 NULL 值
  • 一个表只能有一个主键

外键

  • 引用另一个表中的主键
  • 可以包含重复值和 NULL 值
  • 一个表可以有多个外键

以下是一个表格,总结了它们的主要区别:

特性 主键 外键
唯一性 必须唯一 可以有重复
NULL 值 不能为 NULL 可以为 NULL
表中的数量 只有一个 可以有多个
用途 在其表中标识记录 引用另一个表中的记录

让我们通过一个更复杂的例子来看它们如何工作:

CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name VARCHAR(100),
Email VARCHAR(100)
);

CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

CREATE TABLE OrderItems (
OrderItemID INT PRIMARY KEY,
OrderID INT,
ProductName VARCHAR(100),
Quantity INT,
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);

在这个例子中,我们有三个表:

  1. CustomersCustomerID 为主键
  2. OrdersOrderID 为主键,CustomerID 为引用 Customers 的外键
  3. OrderItemsOrderItemID 为主键,OrderID 为引用 Orders 的外键

这种结构允许我们跟踪哪个客户下了哪个订单,以及每个订单中的项目,而无需不必要地重复客户或订单信息。

结论:整合所有内容

就这样,各位!我们已经穿越了外键的土地,从它们的创建到修改和删除。我们看到它们如何与主键手牵手地创建健壮、高效的数据库结构。

记住,外键就像是数据库社区中的友好邻居 - 它们帮助表之间进行沟通和协作,保持数据的完整性,创建有意义的关系,并保持数据库的顺畅运行。

在你继续你的 SQL 冒险时,继续尝试这些概念。尝试创建你自己的表,添加一些外键约束,看看它们如何影响你的数据操作。你练习得越多,这些概念就会变得越自然。

快乐编码,愿你的查询总是返回你预期的结果!

Credits: Image by storyset