MySQL - 代替鍵:初學者的全面指南
你好,有志於數據庫的熱心者!今天,我們將踏上一段令人興奮的旅程,進入MySQL的世界,特別聚焦於代替鍵。如果你是編程新手,別擔心——我會一步步引導你理解這個概念,正如我過去幾年來為無數學生所做的那樣。所以,來一杯咖啡,我們一起來探索吧!
什麼是代替鍵?
在我們深入細節之前,讓我們從基礎知識開始。代替鍵,也稱為候選鍵,是數據庫表中可以擔任主鍵的列(或列集)。這就像有一把房子的備用鑰匙——它可以打開門,但你通常會使用你的主要鑰匙。
在數據庫術語中,代替鍵與主鍵一樣,唯一標識表中的每條記錄。主要區別在於,雖然可以有多個代替鍵,但只有一個被選為主鍵。
真實世界的比喻
想像你正在組織一個小型圖書館。每本書都可以通過其ISBN號碼、書名和作者組合,或者你分配的獨一無二的條碼唯一標識。所有這些都可以作為標識書的鍵,但你可能會選擇ISBN作為你的主要目錄方式。其它的則是你的代替鍵。
代替鍵的特點
現在我們已經了解了代替鍵是什麼,讓我們來探討它們的關鍵特點:
-
唯一性:與主鍵一樣,代替鍵必須對表中的每條記錄包含唯一值。
-
非空:代替鍵不能包含NULL值。它們必須始終具有有效值。
-
最小化:它們應使用最少的列數來確保唯一性。
-
穩定性:代替鍵列中的值不應該頻繁變化。
-
主鍵候選:任何代替鍵都有可能被選為主鍵。
讓我們看一個例子來說明這些特點:
CREATE TABLE students (
student_id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(50) UNIQUE,
social_security_number VARCHAR(11) UNIQUE,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
在這個students
表中,email
和social_security_number
都是代替鍵。它們是唯一的,非空的(由UNIQUE約束強制執行),並且如果沒有選擇student_id
,它們可以擔任主鍵。
表中的鍵類型
為了更好地理解代替鍵,了解MySQL表中不同類型的鍵是有幫助的。以下是一個快速的概覽:
鍵類型 | 描述 |
---|---|
主鍵 | 表中每條記錄的主要標識符 |
代替鍵(候選鍵) | 可以擔任主鍵的列或列集 |
外鍵 | 參考另一表中主鍵的列 |
組合鍵 | 由兩個或更多列組成的鍵 |
擬像鍵 | 為了標識目的而創造的人造鍵 |
代替鍵應遵循的規則
當使用代替鍵時,有幾個重要的規則需要記住:
- 唯一性至關重要:每個代替鍵必須唯一標識表中的每條記錄。沒有兩行應該對代替鍵有相同的值。
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(20) UNIQUE,
name VARCHAR(100),
price DECIMAL(10, 2)
);
在這個例子中,sku
(庫存單元)是代替鍵。它被標記為UNIQUE以確保沒有兩個產品具有相同的SKU。
- 不允許空值:代替鍵必須始終包含一個值。它們不能留空。
ALTER TABLE products
MODIFY sku VARCHAR(20) UNIQUE NOT NULL;
這個修改確保sku
字段永遠不能為NULL。
- 最小組成:使用最少的列數來達到唯一性。
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
UNIQUE KEY (order_date, customer_id)
);
在這裡,order_date
和customer_id
的組合形成了一個代替鍵。我們使用這兩個因為它們單獨並不唯一,但在一起它們唯一標識一個訂單。
-
穩定性更佳:雖然不一定總是可能的,但最好代替鍵列中的值不要經常變化。
-
考慮性能:記住MySQL會為每個UNIQUE約束創建一個索引,這可能會對大型表的性能产生影响。
CREATE TABLE large_table (
id INT AUTO_INCREMENT PRIMARY KEY,
column1 VARCHAR(50) UNIQUE,
column2 VARCHAR(50) UNIQUE,
-- 添加太多UNIQUE約束可能會減慢大型表的插入和更新
data VARCHAR(1000)
);
在這種情況下,具有多個UNIQUE約束可能會減慢非常大表的插入和更新。
實際範例:圖書數據庫
讓我們將所有這些知識應用於一個更複雜的例子。想像我們正在為一家書店創建數據庫:
CREATE TABLE books (
book_id INT AUTO_INCREMENT PRIMARY KEY,
isbn VARCHAR(13) UNIQUE NOT NULL,
title VARCHAR(200) NOT NULL,
author_first_name VARCHAR(50) NOT NULL,
author_last_name VARCHAR(50) NOT NULL,
publication_year INT,
price DECIMAL(10, 2),
UNIQUE KEY (title, author_last_name, author_first_name)
);
在這個books
表中:
-
book_id
是我們的主鍵。 -
isbn
是代替鍵(每本書都有獨一的ISBN)。 -
title
、author_last_name
和author_first_name
的組合形成另一個代替鍵(假設沒有作者會寫兩本標題相同的書)。
這種結構使我們能夠以多種方式唯一標識書籍,為我們的查詢和數據完整性檢查提供了靈活性。
結論
好了,各位!我們已經穿越了MySQL中代替鍵的土地,從它們的基本定義到它們的特點、類型和應用規則。記住,代替鍵是數據庫中的無名英雄——它們提供了額外的手段來確保數據的完整性和唯一性。
在你繼續你的MySQL冒險時,持續嘗試不同的表結構和鍵組合。你越多練習,數據庫設計就會越直觀。誰知道呢?也許有一天,你會發現自己也在教別人關於代替鍵的奇妙之處!
快樂編程,願你的查詢總是返回你期望的結果!
Credits: Image by storyset