CHECK 約束是資料庫層面的「最後一道防線」,比應用層驗證更可靠。本文匯總常見業務場景的 CHECK 寫法,新手可直接套用。
| 場景 | 字段/類型 | CHECK 條件 | 說明 |
|---|---|---|---|
| 性別標識 | gender SMALLINT | gender IN (0,1) 或 gender BETWEEN 0 AND 1 | 比 <=1 更嚴謹,防負數 |
| 年齡範圍 | age INT | age > 10 AND age < 100 | 業務邊界明確 |
| 單字母代碼 | FlagCode VARCHAR(1) | FlagCode LIKE '[A-Za-z]' | 利用模式匹配 |
| 6位數字郵編 | ZipCode VARCHAR(6) | ZipCode LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]' | 或 ZipCode NOT LIKE '%[^0-9]%' AND LEN(ZipCode)=6 |
| 用戶名以用戶ID開頭 | UserName VARCHAR, UserId VARCHAR | LEFT(UserName, LEN(UserId)) = UserId | 動態長度前綴匹配 |
CONSTRAINT CK_User_Age CHECK (age BETWEEN 18 AND 60),利於後續管理CHECK (EndDate >= StartDate)CHECK (dbo.fn_IsValidEmail(Email) = 1),將複雜邏輯封裝為標量函數ALTER TABLE t NOCHECK CONSTRAINT CK_Name(大批量導入時提速,導入後 WITH CHECK CHECK CONSTRAINT 重新驗證)NULL 值會使 CHECK 條件評估為 UNKNOWN(視為通過),若需強制非空請加 NOT NULL[] 為 SQL Server 特有,跨庫請用 REGEXP 或應用層校驗