關聯式資料庫與資料完整性:初學者指南
更新日期: 2025 年 3 月 4 日
本文為 SQL 關聯資料庫 基本介紹系列文,第 1 篇:
- 關聯式資料庫與資料完整性:初學者指南 👈進度
- SQL 觸發器(Triggers):自動執行的資料庫機制
- Django 信號(Signals) vs SQL 觸發器(Triggers):關係與差異解析
- 關聯式資料庫與交易(Transaction)機制入門
- 深入理解死結(Deadlock)與發生條件
- DCL(資料控制語言)入門:SQL 權限管理基礎
- SQL 儲存程序(Stored Procedure)入門
- ORM(對象關係對映):讓資料庫操作更簡單的工具
- SQL 儲存程序 vs ORM:如何選擇最適合的數據庫操作方式?
- 關聯式資料庫 View(檢視)是什麼?完整指南
- 理解 Materialized View:初學者指南
在現代資訊系統中,關聯式資料庫(Relational Database)是最常見的資料存儲方式之一。
無論是電商網站、企業管理系統,還是社交媒體平台,都依賴關聯式資料庫來存儲與管理資料。
然而,確保資料的準確性、一致性和可靠性至關重要,這就是「資料完整性」的概念。
本篇文章將介紹關聯式資料庫的基本概念,並探討如何透過各種機制來確保資料完整性。
什麼是關聯式資料庫?
關聯式資料庫(Relational Database,簡稱 RDB)是一種使用「表格」來組織和存儲資料的數據庫類型。
這些表格由 欄位(Columns)和列(Rows) 組成,每個欄位代表一種資料屬性,而每一列則對應一筆資料。
關聯式資料庫的核心特性
- 結構化存儲:數據以表格(Table)形式存儲,每張表通常具有主鍵(Primary Key)來唯一標識資料。
- 關聯性:表與表之間透過外鍵(Foreign Key)來建立關聯,避免資料重複存儲。
- 標準化語言:使用 SQL(Structured Query Language)進行查詢和管理。
- 資料完整性保證:透過不同的約束條件(Constraints)和機制,確保資料的準確性與一致性。
資料完整性是什麼?
資料完整性(Data Integrity)指的是確保資料的準確性、一致性和可靠性,防止資料丟失、損壞或不正確的數據進入資料庫。
這對於商業應用來說極為重要,因為不完整或錯誤的數據可能會導致業務決策錯誤。
資料完整性通常分為以下幾種類型:
- 實體完整性(Entity Integrity):確保每一條記錄都能被唯一識別,通常透過主鍵(Primary Key)來實現。
- 參考完整性(Referential Integrity):確保不同表格之間的關聯性正確,避免孤立的資料,通常透過外鍵(Foreign Key)來維護。
- 域完整性(Domain Integrity):限制特定欄位的值類型,確保數據符合預期格式,如數字欄位不能存儲文字。
- 業務完整性(Business Integrity):基於業務規則制定的數據約束,例如員工薪資不能低於最低工資標準。
如何確保關聯式資料庫的資料完整性?
使用主鍵(Primary Key)確保實體完整性
主鍵(Primary Key, PK)是表中的唯一標識,每一筆記錄都必須擁有獨一無二的主鍵,確保無重複資料。例如:
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Name VARCHAR(50),
Email VARCHAR(100) UNIQUE
);
這樣就確保了 UserID
在 Users
表中是唯一的,同時 Email
也不能重複。
使用外鍵(Foreign Key)確保參考完整性
外鍵(Foreign Key, FK)用於建立不同表格之間的關聯,並確保關聯關係的正確性。例如,一個訂單必須關聯到一個存在的客戶:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
UserID INT,
OrderDate DATE,
FOREIGN KEY (UserID) REFERENCES Users(UserID) ON DELETE CASCADE
);
這樣可以確保 Orders
表中的 UserID
必須對應 Users
表中有效的 UserID
,而且當 Users
中的用戶被刪除時,對應的訂單資料也會自動刪除(ON DELETE CASCADE
)。
設定資料類型與約束條件確保域完整性
使用適當的資料類型和約束條件(Constraints)可以確保輸入的資料符合預期格式。例如:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Name VARCHAR(100) NOT NULL,
Price DECIMAL(10,2) CHECK (Price > 0),
Stock INT DEFAULT 0 CHECK (Stock >= 0)
);
NOT NULL
:確保Name
欄位不能為空。CHECK
:確保Price
必須大於 0,Stock
不能是負數。DEFAULT
:當Stock
沒有指定時,自動設為 0。
使用觸發器(Triggers)確保業務邏輯
有時候,SQL 本身的約束條件可能無法滿足所有的業務需求,因此可以使用觸發器(Trigger)來進一步保證資料完整性。
例如,確保顧客的信用額度不被超限:
CREATE TRIGGER CheckCreditLimit
BEFORE INSERT ON Orders
FOR EACH ROW
BEGIN
DECLARE user_credit DECIMAL(10,2);
SELECT CreditLimit INTO user_credit FROM Users WHERE UserID = NEW.UserID;
IF (NEW.TotalAmount > user_credit) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '信用額度不足';
END IF;
END;
當新訂單的 TotalAmount
超過顧客的信用額度時,插入操作將被阻止。
使用事務(Transactions)確保一致性
在多步驟操作中,如果發生錯誤,事務(Transaction)可以回滾(Rollback),確保資料庫不會存入不完整的資料。例如:
START TRANSACTION;
INSERT INTO Orders (OrderID, UserID, OrderDate) VALUES (101, 1, '2025-02-25');
INSERT INTO OrderDetails (OrderDetailID, OrderID, ProductID, Quantity) VALUES (1, 101, 5, 2);
COMMIT; -- 若所有步驟成功,則提交更改
-- ROLLBACK; -- 若有錯誤,則回滾
定期備份與驗證
即使資料完整性機制運行良好,仍需定期備份資料庫,以防止意外刪除或系統故障導致的資料遺失。
BACKUP DATABASE mydatabase TO DISK = 'C:\backup\mydatabase.bak';
結語
關聯式資料庫提供了多種確保資料完整性的機制,包括主鍵、外鍵、約束條件、觸發器和事務處理等。
這些方法能夠有效防止錯誤資料進入系統,確保應用程式運行的穩定性和可靠性。
對於初學者來說,理解並掌握這些概念,將有助於建立更安全、可靠的資料庫系統。
希望這篇文章能幫助你更好地理解關聯式資料庫的資料完整性!如果有任何問題,歡迎討論! 🚀