SQL - 複合鍵:初學者指南

你好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入 SQL 的世界,並探索一個可能起初聽起來有些令人却步的概念,但實際上非常簡單且非常有用的概念。我們要談論的是複合鍵!

SQL - Composite Key

複合鍵是什麼?

在我們深入之前,讓我們從基礎開始。想像你正在組織一個巨大的圖書館。每本書都需要一個唯一的標識符,對吧?但如果僅憑書名不足以區分它呢?這就是我們的英雄,複合鍵,出場的時候!

複合鍵就像是數據庫世界中的超級英雄聯盟。它是兩個或多個列的組合,共同唯一地標識表中的一行。就像說,“這本書之所以獨特,是因為它的書名、作者和出版年份。”

為什麼使用複合鍵?

  1. 唯一性:它們確保表中的每一行都是真正的唯一。
  2. 數據完整性:它們幫助維護數據的準確性和一致性。
  3. 建立關係:它們非常適合在表之間創建聯接。

現在,讓我們捋起袖子,開始寫一些代碼吧!

創建複合鍵

讓我們為我們想像中的圖書館創建一個表:

CREATE TABLE books (
title VARCHAR(100),
author VARCHAR(50),
publication_year INT,
ISBN VARCHAR(13),
PRIMARY KEY (title, author, publication_year)
);

在這個例子中,我們使用 titleauthorpublication_year 列創建了一個複合鍵。這意味著沒有兩本書可以具有這三個屬性的相同組合。

使用複合鍵插入數據

讓我們將一些書籍添加到我們的圖書館:

INSERT INTO books (title, author, publication_year, ISBN)
VALUES ('了不起的蓋茨比', 'F. 斯科特·菲茨傑拉德', 1925, '9780743273565'),
('梅根的鳥', '哈珀·李', 1960, '9780446310789'),
('1984', '喬治·奧威爾', 1949, '9780451524935');

這些插入將正常工作,因為每個書名、作者和出版年份的組合都是唯一的。

但如果我們嘗試插入一個重複的呢?

INSERT INTO books (title, author, publication_year, ISBN)
VALUES ('了不起的蓋茨比', 'F. 斯科特·菲茨傑拉德', 1925, '1234567890123');

哦哦!這將會引發一個錯誤,因為我們已經有一本具有這個確切書名、作者和出版年份的書了。我們的複合鍵正在發揮作用!

使用複合鍵查詢

當查詢具有複合鍵的表時,你通常需要指定鍵的所有部分:

SELECT * FROM books
WHERE title = '了不起的蓋茨比'
AND author = 'F. 斯科特·菲茨傑拉德'
AND publication_year = 1925;

這個查詢將返回我們正在尋找的確切書籍。

刪除複合鍵

現在,如果我們決定我們的複合鍵不再適用於我們,怎麼辦?也許我們已經意識到 ISBN 實際上是對我們的書籍更好的唯一標識符。讓我們看看在不同數據庫系統中如何刪除複合鍵。

在 MySQL 中刪除複合鍵

在 MySQL 中,刪除複合鍵非常直接:

ALTER TABLE books
DROP PRIMARY KEY;

刪除鍵後,我們可以添加一個新的主鍵(如果願意的話):

ALTER TABLE books
ADD PRIMARY KEY (ISBN);

在 SQL Server 中刪除複合鍵

SQL Server 遵循類似的模式:

ALTER TABLE books
DROP CONSTRAINT PK_books;

在這裡,PK_books 是主鍵約束的名稱。如果你不確定約束名稱,你可以使用以下方式找到它:

SELECT name
FROM sys.key_constraints
WHERE type = 'PK' AND parent_object_id = OBJECT_ID('books');

然後,與 MySQL 一樣,我們可以添加一個新的主鍵:

ALTER TABLE books
ADD CONSTRAINT PK_books PRIMARY KEY (ISBN);

複合鍵與單列鍵

現在你可能會想,“既然我可以只用一個列,為什麼要麻煩使用複合鍵?” 好問題!讓我們來分析一下:

方面 複合鍵 單列鍵
唯一性 可以跨多個屬性確保唯一性 限制於單個屬性的唯一性
灵活性 在表示複雜關係時更灵活 更簡單,但可能不會捕獲所有必要信息
查詢性能 為索引和查詢可能會更慢 通常對索引和查詢更快
數據完整性 可以強制執行更複雜的業務規則 更容易維護
存儲 可能需要更多的存儲空間 通常需要更少的存儲空間

總結

這就是它,各位!我們已經穿越了複合鍵的土地,從創建到查詢到刪除。記住,就像你 SQL 工具包中的任何工具一樣,複合鍵有它適用的時機和場合。它們對於確保跨多個列的唯一性和表示複雜關係非常棒,但可能不會在每種情況下都是最佳選擇。

在你繼續你的 SQL 冒險時,繼續嘗試不同的鍵結構。你實踐得越多,它就越會變得直觀。誰知道呢?有一天,你也可能會向一批渴望的學習者解釋複合鍵!

下次見,快樂編程,願你的查詢總是返回你所尋找的結果!

Credits: Image by storyset