SQL CHECK 約束:確保數據有效性的關鍵機制
更新日期: 2025 年 3 月 4 日
在 SQL 中,數據完整性是關鍵的一環,確保儲存到資料庫的數據符合特定的業務邏輯至關重要。
其中,CHECK
約束(Constraint)是一種強大的工具,它允許我們設定規則來限制特定欄位的輸入範圍或條件,從而確保數據的準確性和一致性。
本篇文章將帶你深入了解 SQL CHECK
關鍵字的作用、語法以及實際應用,並提供一些最佳實踐來幫助你更有效地管理資料庫。
什麼是 CHECK
約束?
CHECK
是 SQL 用來定義數據完整性約束的關鍵字,它允許你為特定欄位或表定義條件,使其只能存儲符合該條件的數據。
舉例來說,假設我們有一個 Users
表,其中 Age
欄位只能接受 18 歲以上的數值,那麼我們可以使用 CHECK
來確保這項規則被強制執行。
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT CHECK (Age >= 18)
);
如果我們嘗試插入 Age
小於 18 的記錄,SQL 會拒絕這筆數據,從而確保數據的完整性。
CHECK
的基本語法
CHECK
約束可以在 表級別 或 欄位級別 定義,語法如下:
欄位級 CHECK
欄位級 CHECK
直接與某個欄位綁定,通常在 CREATE TABLE
時指定:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Salary DECIMAL(10,2) CHECK (Salary >= 30000)
);
這表示 Salary
欄位的數值必須大於或等於 30,000,否則無法插入或更新記錄。
表級 CHECK
表級 CHECK
則可以跨多個欄位來設定約束,語法如下:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
Quantity INT,
Price DECIMAL(10,2),
CHECK (Quantity > 0 AND Price > 0)
);
這裡的 CHECK
限制 Quantity
和 Price
都必須大於 0,確保訂單的數據是合理的。
如何在已存在的表中新增 CHECK
約束?
如果你的表已經存在,但後來才發現需要加上 CHECK
約束,可以使用 ALTER TABLE
命令:
ALTER TABLE Users
ADD CONSTRAINT chk_age CHECK (Age >= 18);
這樣可以新增 chk_age
約束,確保 Age
欄位不會存入小於 18 的數據。
如何刪除 CHECK
約束?
如果後續需要移除 CHECK
約束,可以使用 ALTER TABLE
和 DROP CONSTRAINT
:
ALTER TABLE Users
DROP CONSTRAINT chk_age;
這樣就能刪除 chk_age
限制,使 Age
欄位不再受此條件約束。
CHECK
的實際應用案例
限制數據輸入範圍
假設你有一個 Products
表,價格不能是負數,且庫存數量不能低於 0,可以使用 CHECK
:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Price DECIMAL(10,2) CHECK (Price >= 0),
Stock INT CHECK (Stock >= 0)
);
確保資料邏輯一致
在 Students
表中,學生的 GPA
必須在 0.0 到 4.0 之間:
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
Name VARCHAR(50),
GPA DECIMAL(3,2) CHECK (GPA BETWEEN 0.0 AND 4.0)
);
設定條件來防止業務錯誤
在 BankAccounts
表中,帳戶餘額 Balance
不能為負數:
CREATE TABLE BankAccounts (
AccountID INT PRIMARY KEY,
AccountHolder VARCHAR(100),
Balance DECIMAL(15,2) CHECK (Balance >= 0)
);
CHECK
的限制與注意事項
雖然 CHECK
約束在確保數據完整性方面非常有用,但在使用時需要注意以下幾點:
- 不同的資料庫支援度不同
- MySQL 5.x 版本以前不支援
CHECK
(但 MySQL 8.0 以上支援)。 - PostgreSQL、SQL Server、Oracle 完全支援
CHECK
。
- MySQL 5.x 版本以前不支援
CHECK
不能參考其他表- 例如,
CHECK
不能檢查Users
表中的Age
是否大於Employees
表中的MinimumAge
。 - 如果需要跨表約束,應該使用 外鍵(FOREIGN KEY) 或 觸發器(TRIGGER)。
- 例如,
CHECK
可能影響數據庫效能- 在插入或更新時,SQL 需要檢查是否符合
CHECK
條件,這可能會對大規模數據操作造成影響。
- 在插入或更新時,SQL 需要檢查是否符合
結語
CHECK
關鍵字是一種簡單卻強大的方式,能有效確保數據符合業務邏輯,防止不合理的數據進入資料庫。無論是在建立新表時使用,或是對現有表新增限制,CHECK
都能幫助我們提升數據完整性。
當你在設計資料庫時,不妨善用 CHECK
來確保數據的有效性,並避免後續因數據錯誤而產生的問題。希望這篇文章能幫助你更好地理解 CHECK
的運用! 🚀