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 限制 QuantityPrice 都必須大於 0,確保訂單的數據是合理的。


如何在已存在的表中新增 CHECK 約束?

如果你的表已經存在,但後來才發現需要加上 CHECK 約束,可以使用 ALTER TABLE 命令:

ALTER TABLE Users
ADD CONSTRAINT chk_age CHECK (Age >= 18);

這樣可以新增 chk_age 約束,確保 Age 欄位不會存入小於 18 的數據。


如何刪除 CHECK 約束?

如果後續需要移除 CHECK 約束,可以使用 ALTER TABLEDROP 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 約束在確保數據完整性方面非常有用,但在使用時需要注意以下幾點:

  1. 不同的資料庫支援度不同
    • MySQL 5.x 版本以前不支援 CHECK(但 MySQL 8.0 以上支援)。
    • PostgreSQL、SQL Server、Oracle 完全支援 CHECK
  2. CHECK 不能參考其他表
    • 例如,CHECK 不能檢查 Users 表中的 Age 是否大於 Employees 表中的 MinimumAge
    • 如果需要跨表約束,應該使用 外鍵(FOREIGN KEY)觸發器(TRIGGER)
  3. CHECK 可能影響數據庫效能
    • 在插入或更新時,SQL 需要檢查是否符合 CHECK 條件,這可能會對大規模數據操作造成影響。

結語

CHECK 關鍵字是一種簡單卻強大的方式,能有效確保數據符合業務邏輯,防止不合理的數據進入資料庫。無論是在建立新表時使用,或是對現有表新增限制,CHECK 都能幫助我們提升數據完整性。

當你在設計資料庫時,不妨善用 CHECK 來確保數據的有效性,並避免後續因數據錯誤而產生的問題。希望這篇文章能幫助你更好地理解 CHECK 的運用! 🚀

Similar Posts