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. Customers,其 CustomerID 為主鍵
  2. Orders,其 OrderID 為主鍵,CustomerID 為引用 Customers 的外鍵
  3. OrderItems,其 OrderItemID 為主鍵,OrderID 為引用 Orders 的外鍵

這種結構使我們能夠追蹤哪個顧客下了哪些訂單,以及每個訂單中的哪些商品,而不需要不必要地重複顧客或訂單信息。

結論:將一切匯總

好了,各位!我們已經穿越了外鍵的土地,從它的創建到它的修改和刪除。我們看到了它們如何與主鍵手拉手地創建堅固、高效的數據庫結構。

記住,外鍵就像是數據庫社區中的友好鄰居 - 它們幫助表之間進行交流並協同工作。它們保證數據完整性,創建有意義的關係,並使你的數據庫運行順暢。

在你繼續你的 SQL 冒險時,請繼續實驗這些概念。嘗試創建你自己的表,添加一些外鍵約束,並看看它們如何影響你的數據操作。你實踐得越多,這些概念就越會變得自然。

祝編程愉快,願你的查詢總是返回你期望的結果!

Credits: Image by storyset