SQL - 唯一索引:數據完整性的關鍵

你好,有抱負的數據庫愛好者!今天,我們將踏上一段令人興奮的旅程,探索 SQL 唯一索引的世界。作為你們友善的鄰居計算機科學老師,我將帶著過去 15 年在課堂上的熱情,來指導你們這個主題。所以,拿起你的虛擬筆記本,讓我們一起深入探討!

SQL - Unique Index

什麼是 SQL 唯一索引?

想像你正在組織一個巨大的圖書館。你希望確保沒有兩本書具有相同的 ISBN 編號。這正是數據庫中的唯一索引所做的 - 它確保表中沒有兩行在特定列或列集合中有相同的值。

唯一索引的基本概念

SQL 中的唯一索引是一種特殊類型的索引,它強制執行表中一個或多個列的值唯一性。這就像給你的每一個寵物一個唯一的名字 - 沒有兩個可以相同!

讓我們從一個簡單的例子開始:

CREATE TABLE students (
student_id INT PRIMARY KEY,
email VARCHAR(100),
name VARCHAR(50)
);

CREATE UNIQUE INDEX idx_student_email
ON students (email);

在這個例子中,我們創建了一個名為 students 的表,然後在 email 列上添加了一個唯一索引。這確保了沒有兩個學生可以擁有相同的電子郵件地址。

為什麼使用唯一索引?

  1. 數據完整性: 它們防止重複數據被插入到你的表中。
  2. 性能: 它們可以加快尋找特定唯一值的查詢速度。
  3. 約束替代: 在某些情況下,它們可以用作唯一約束的替代。

創建唯一索引

有幾種方法可以創建唯一索引。讓我們來探討一下!

方法 1:在創建表時

你可以在創建表的時候創建唯一索引:

CREATE TABLE products (
product_id INT PRIMARY KEY,
product_code VARCHAR(20) UNIQUE,
product_name VARCHAR(100)
);

在這裡,product_code 將自動為它創建一個唯一索引。

方法 2:在創建表後

你也可以為現有的表添加唯一索引:

CREATE UNIQUE INDEX idx_product_name
ON products (product_name);

這在我們的 products 表的 product_name 列上創建了一個唯一索引。

繩加重複值

現在,如果我們嘗試插入或更新一行,其中的值已經在我們的唯一索引中存在,會發生什麼?讓我們來找出答案!

INSERT INTO products (product_id, product_code, product_name)
VALUES (1, 'ABC123', 'Super Widget');

INSERT INTO products (product_id, product_code, product_name)
VALUES (2, 'ABC123', 'Mega Gadget');

第一個插入將正常工作,但第二個將失敗,因為 'ABC123' 已經作為 product_code 使用。SQL 將拋出一個錯誤,保護我們的數據完整性。

在多個字段上創建唯一索引

有時候,我們需要在列組合上實現唯一性。這就是多列唯一索引派上用場的地方!

CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
product_id INT
);

CREATE UNIQUE INDEX idx_customer_date_product
ON orders (customer_id, order_date, product_id);

這個索引確保一個客戶在同一天不能訂購同樣的產品兩次。這就像確保你的朋友不會不小心買到同一場電影的兩張票!

真實世界例子

讓我們說我們正在構建一個學校管理系統。我們希望確保一個學生在一個學期內不能對同一門課程報名超過一次:

CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
semester VARCHAR(20),
grade CHAR(1)
);

CREATE UNIQUE INDEX idx_student_course_semester
ON enrollments (student_id, course_id, semester);

現在,如果我們嘗試將學生報名到這個學期他們已經選修的課程,SQL 將會婉轉拒絕:

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (1, 101, 'CS101', 'Fall 2023');

-- 這會成功

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (2, 101, 'CS101', 'Fall 2023');

-- 這會因為唯一索引而失敗

唯一索引方法

以下是一個總結我們討論過的創建唯一索引方法的表格:

方法 描述 示例
表創建 在創建表的時候定義唯一列 CREATE TABLE students (id INT PRIMARY KEY, email VARCHAR(100) UNIQUE);
更改表 為現有的表添加唯一約束 ALTER TABLE students ADD CONSTRAINT uc_email UNIQUE (email);
創建索引 為現有的表創建獨立的唯一索引 CREATE UNIQUE INDEX idx_email ON students (email);

結論

這就是了,我親愛的學生們!我們一起穿過了 SQL 唯一索引的土地,從基本概念到在多個字段上創建索引。記住,唯一索引是強大的工具,但請明智地使用它們。太多的索引可能會減慢你的數據庫插入和更新。這一切都是關於找到那個完美的平衡,就像在深夜編程時完美調整咖啡和代碼的比例一樣!

現在,去創建有獨特魅力的數據庫吧!並記住,在 SQL 的世界中,保持獨特性永遠是時尚的。快樂編程!

Credits: Image by storyset