SQL Server约束条件详解:常见字段校验规则与CHECK约束用法
在数据库设计过程中,约束(Constraint)是保障数据准确性与完整性的核心机制。SQL Server提供了多种强大的约束类型,其中CHECK约束尤为重要,能够确保字段输入值严格遵循业务逻辑。本文整理了17种典型的约束场景及其标准SQL实现方式,覆盖从简单的数值范围检查到复杂的格式校验,均可直接应用于实际项目开发。
1. 性别字段约束:仅允许输入男或女
Sex in ('男','女') -- 或者 Sex = '男' or Sex = '女'
2. 年龄范围校验:设置合理上下限
Sage > 0 and Sage < 120 -- 也可用 between Sage between 12 and 30
3. 密码长度要求:必须大于指定值
len(pwd) > 6 -- pwd为密码字段
4. 数值下限约束:字段值大于固定阈值
Sage > 1
5. 复杂格式校验:限定8位字符,前两位为0,3~4位数字,第5位下划线,6~8位字母
alter table 表名 add constraint check (
字段 like '00[0-9][0-9]/_[a-z,A-Z][a-z,A-Z][a-z,A-Z]%' escape '/'
and (len(字段)=8)
)
-- 或者
alter table 表名 add constraint check (
字段 like '00[0-9][0-9][_][a-z,A-Z][a-z,A-Z][a-z,A-Z]%'
and (len(字段)=8)
)
6. 电子邮箱验证:必须包含@符号
字段 like '%@%'
7. 首字母约束:字段值需以指定字母开头
c字段 like 's%'
8. 前后数字限制:前3位与后8位均为数字字符
字段 like '[0-9][0-9][0-9]%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
9. 身份证号校验:18位且最后一位可为X
select 身份证号 from 表名 where len(身份证号) = 18 and (right(身份证号,17) like '[0-9]' or right(身份证号,17) like 'X')
10. 区号格式控制:3/4/5位纯数字
字段 LIKE '[0-9][0-9][0-9]' OR 字段 LIKE '[0-9][0-9][0-9][0-9]' OR 字段 LIKE '[0-9][0-9][0-9][0-9][0-9]' -- 说明:'[0-9][0-9][0-9]'表示3位数字区号(如010),4位表示4位区号(如0398),5位表示5位区号(如00852)
11. 时间顺序约束:最后回复时间需大于发帖时间且小于等于当前时间
字段:TLastClickT(最后回复时间)和 TTime(发帖时间)。使用GetDate()函数获取当前时间。

设计表时添加约束
-- 在TLastClickT上右击选择约束,新建,填入: ([TLastClickT] > [TTime] and [TLastClickT] < GetDate())
或者用ALTER TABLE方式:
alter table topic add constraint check(
TlastReply is null or TlastReply > Ttime
)
注意:创建表时可能还没有回帖记录,所以允许默认NULL值,约束条件过滤掉NULL情况即可。
12. 长度与内容混合校验:前8位为数字或“-”,总长度15位(CHAR型)
字段 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%' or len(字段)=15
13. 特殊字符限制:禁止varchar字段出现单引号
ALTER TABLE tablename ADD CONSTRAINT CK_fieldname CHECK (not fieldname like '%''%')
14. 固定格式约束:某列必须符合特定模式
check(sid like 'bd[0-9][0-9][0-9][0-9][0-9][0-9]') add CONSTRAINT ck_num check(num like '[1][2] [4][_] [0-9][0-9] [0-9][a-z]')
15. 数字字符限制:varchar字段仅允许包含数字(禁止非数字字符)
ALTER TABLE [dbo].[TABLENAME] ADD CONSTRAINT [CK_TABLENAME] CHECK (isnumeric([VAR_FIELD]) = 1)
这样,字段一旦出现非数字内容就会报错。
16. 电话号码格式:xxxx-xxxxxxxx 或 11位手机号
alter 表名 add constraint ck_字段名 check (字段 like '[0-9][0-9][0-9][0-9]_[0-9]…' or len(字段)=11)
17. 身份证号约束:18位且唯一
alter 表名 add constraint ck_字段名 check (len(字段名)=18) alter 表名 add constraint uk_字段名 unique (字段名)
总结
以上约束案例全面覆盖了SQL Server数据库中的常见字段校验需求,从数值范围、长度限制到复杂模式匹配,均可通过CHECK约束结合LIKE、LEN、ISNUMERIC等函数灵活实现。实际应用时需根据字段类型及业务规则选择合适的表达式,并注意NULL值的处理方式。这些经过验证的实用模板,能够为正在设计数据表的开发人员提供高效参考,助力构建更规范、更健壮的数据库结构。
