MySQL - 代替鍵:初學者的全面指南

你好,有志於數據庫的熱心者!今天,我們將踏上一段令人興奮的旅程,進入MySQL的世界,特別聚焦於代替鍵。如果你是編程新手,別擔心——我會一步步引導你理解這個概念,正如我過去幾年來為無數學生所做的那樣。所以,來一杯咖啡,我們一起來探索吧!

MySQL - Alternate Key

什麼是代替鍵?

在我們深入細節之前,讓我們從基礎知識開始。代替鍵,也稱為候選鍵,是數據庫表中可以擔任主鍵的列(或列集)。這就像有一把房子的備用鑰匙——它可以打開門,但你通常會使用你的主要鑰匙。

在數據庫術語中,代替鍵與主鍵一樣,唯一標識表中的每條記錄。主要區別在於,雖然可以有多個代替鍵,但只有一個被選為主鍵。

真實世界的比喻

想像你正在組織一個小型圖書館。每本書都可以通過其ISBN號碼、書名和作者組合,或者你分配的獨一無二的條碼唯一標識。所有這些都可以作為標識書的鍵,但你可能會選擇ISBN作為你的主要目錄方式。其它的則是你的代替鍵。

代替鍵的特點

現在我們已經了解了代替鍵是什麼,讓我們來探討它們的關鍵特點:

  1. 唯一性:與主鍵一樣,代替鍵必須對表中的每條記錄包含唯一值。

  2. 非空:代替鍵不能包含NULL值。它們必須始終具有有效值。

  3. 最小化:它們應使用最少的列數來確保唯一性。

  4. 穩定性:代替鍵列中的值不應該頻繁變化。

  5. 主鍵候選:任何代替鍵都有可能被選為主鍵。

讓我們看一個例子來說明這些特點:

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表中,emailsocial_security_number都是代替鍵。它們是唯一的,非空的(由UNIQUE約束強制執行),並且如果沒有選擇student_id,它們可以擔任主鍵。

表中的鍵類型

為了更好地理解代替鍵,了解MySQL表中不同類型的鍵是有幫助的。以下是一個快速的概覽:

鍵類型 描述
主鍵 表中每條記錄的主要標識符
代替鍵(候選鍵) 可以擔任主鍵的列或列集
外鍵 參考另一表中主鍵的列
組合鍵 由兩個或更多列組成的鍵
擬像鍵 為了標識目的而創造的人造鍵

代替鍵應遵循的規則

當使用代替鍵時,有幾個重要的規則需要記住:

  1. 唯一性至關重要:每個代替鍵必須唯一標識表中的每條記錄。沒有兩行應該對代替鍵有相同的值。
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(20) UNIQUE,
name VARCHAR(100),
price DECIMAL(10, 2)
);

在這個例子中,sku(庫存單元)是代替鍵。它被標記為UNIQUE以確保沒有兩個產品具有相同的SKU。

  1. 不允許空值:代替鍵必須始終包含一個值。它們不能留空。
ALTER TABLE products
MODIFY sku VARCHAR(20) UNIQUE NOT NULL;

這個修改確保sku字段永遠不能為NULL。

  1. 最小組成:使用最少的列數來達到唯一性。
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE,
customer_id INT,
UNIQUE KEY (order_date, customer_id)
);

在這裡,order_datecustomer_id的組合形成了一個代替鍵。我們使用這兩個因為它們單獨並不唯一,但在一起它們唯一標識一個訂單。

  1. 穩定性更佳:雖然不一定總是可能的,但最好代替鍵列中的值不要經常變化。

  2. 考慮性能:記住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)。
  • titleauthor_last_nameauthor_first_name的組合形成另一個代替鍵(假設沒有作者會寫兩本標題相同的書)。

這種結構使我們能夠以多種方式唯一標識書籍,為我們的查詢和數據完整性檢查提供了靈活性。

結論

好了,各位!我們已經穿越了MySQL中代替鍵的土地,從它們的基本定義到它們的特點、類型和應用規則。記住,代替鍵是數據庫中的無名英雄——它們提供了額外的手段來確保數據的完整性和唯一性。

在你繼續你的MySQL冒險時,持續嘗試不同的表結構和鍵組合。你越多練習,數據庫設計就會越直觀。誰知道呢?也許有一天,你會發現自己也在教別人關於代替鍵的奇妙之處!

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

Credits: Image by storyset