首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server CHECK 約束實戰:從性別、年齡到郵編、用戶名的數據完整性守護

     編輯:關於SqlServer

CHECK 約束是資料庫層面的「最後一道防線」,比應用層驗證更可靠。本文匯總常見業務場景的 CHECK 寫法,新手可直接套用。

經典案例庫

場景字段/類型CHECK 條件說明
性別標識gender SMALLINTgender IN (0,1) 或 gender BETWEEN 0 AND 1比 <=1 更嚴謹,防負數
年齡範圍age INTage > 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 VARCHARLEFT(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
  • LIKE 模式中 [] 為 SQL Server 特有,跨庫請用 REGEXP 或應用層校驗
  • 過於複雜的 CHECK 影響 INSERT/UPDATE 性能,權衡業務關鍵度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved