游乐游手机版
首页/数据库/文章详情

SQL Server常见约束条件用法详解

时间:2026-06-14 07:02
SQL Server约束条件详解:常见字段校验规则与CHECK约束用法 在数据库设计过程中,约束(Constraint)是保障数据准确性与完整性的核心机制。SQL Server提供了多种强大的约束类型,其中CHECK约束尤为重要,能够确保字段输入值严格遵循业务逻辑。本文整理了17种典型的约束场景及其

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()函数获取当前时间。

SQLServer常见的约束条件用法及说明

设计表时添加约束

-- 在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值的处理方式。这些经过验证的实用模板,能够为正在设计数据表的开发人员提供高效参考,助力构建更规范、更健壮的数据库结构。

来源:https://www.jb51.net/database/3618655r8.htm
上一篇一文掌握SQL Server日期显示格式四种完整设置方法 下一篇详解SQL Server触发器常见应用场景与注意事项
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须