大家知道,关系型数据库的逻辑运算的结果是三值型的,TRUE,FALSE和UNKNOWN,特别是,NULL值和任何值都不相等,任何值和NULL的比较,返回的逻辑结果都是unknown。而NULL值在唯一约束和Check约束中的表现,不同于NULL值的定义。

唯一(Unique)约束在内部使用唯一索引来保证列值的唯一性。在一个列上创建唯一约束(unique)之后,该列允许插入null值,通常情况下,两个null值是不相等的,但是在唯一约束中,unique约束把两个null值看作是相同的,也就是说,null和null是相等的,null和其他任何非null值都不相等。

Check约束用以限制单列的可能取值范围,在check约束中(check(expression)),如果expression返回的结果是Unknown,那么check约束返回的结果是true。这就意味着,如果expression的值是null,那么该表达式的值满足check约束。

一,唯一约束

唯一约束可以创建在列级别上,也可以在表级别上。在列级别上, default 约束定义的语法是:分为column level和table level,区别在于Table Level需要制定unique约束影响的column(or columns)。

列级别定义的唯一约束的语法是:

column_name <data_type>[ CONSTRAINT constraint_name ] UNIQUE 

表级别定义的唯一约束的语法是:

[ CONSTRAINT constraint_name ] UNIQUE(column [ ASC | DESC ] [ ,...n ] )

 二,向现有表上增加唯一约束

1,增加unique约束

alter table dbo.dt_test_unique
add constraint uq_test_id unique nonclustered(id)

2,删除unique约束

alter table dbo.dt_test_unique
drop constraint uq_test_id

3,修改unique约束

不能在现存的表上修改unique约束,变通的方法是先删除 unique约束,后增加一个新的unique约束

alter table dbo.dt_test_unique
drop constraint uq_test_id alter table dbo.dt_test_unique
add constraint uq_test_id unique nonclustered(id)

三,Check约束

Check约束用以限制单列的可能取值范围,需要在Check约束中指定逻辑表达式,该逻辑表达式必须返回逻辑值(TRUE或FALSE),在Check中,把UNKNOWN值认为是TRUE。

check(expression)

1,在check约束中

如果expression返回的结果是Unknown,那么check返回的结果是true。

create table dbo.dt_check
(
id int null constraint ck_ID_is_Positive check(id>0)
)

插入数据,测试check约束的工作机制

insert into dbo.dt_check
values(null)
insert into dbo.dt_check
values(1)
insert into dbo.dt_check
values(0)

INSERT 语句与 CHECK 约束"ck_ID_is_Positive"冲突。该冲突发生于数据库"db_study",表"dbo.dt_check", column 'id'。

语句已终止。

NULL和1 插入成功,而0插入失败。

2,在表级别上定义Check约束

在表级别上定义Check约束,可以对多列的可能取值进行限制

create table dbo.dt_check
(
id int null ,
code int null,
constraint ck_IDCode_is_Positive check(id>0 and code >0)
)

在一个已经创建的table上,通过alter table命令来增加、修改和删除check约束,添加的约束是表级别的约束

3,增加check约束

alter table dbo.dt_check
add constraint ck_ID_is_Positive check(id>0)

4,删除check约束

alter table dbo.dt_check
drop constraint ck_ID_is_Positive

5,修改Check约束

没法直接修改Check约束,变通方法是:必须先删除约束,然后添加新的check约束

alter table dbo.dt_check
drop constraint ck_ID_is_Positive alter table dbo.dt_check
add constraint ck_ID_is_Positive check(id>0)

6,通过alter table命令增加新的列,并在列级别上创建check 约束

alter table dbo.dt_check
add sex char(1) not null
constraint ck_sex check(sex in('M','F'))

参考文档:

SQLServer - 约束

SQL Server中约束的介绍

table_constraint (Transact-SQL)

最新文章

  1. C语言atan2()函数:求y/x的反正切值
  2. sdust 2410 Mine Number
  3. Java(jdk1.7) 陷阱
  4. WdatePicker 控制选择范围
  5. HDOJ 3415 Max Sum of Max-K-sub-sequence(单调队列)
  6. 高级UNIX环境编程5 标准IO库
  7. post提交数据长度限制问题
  8. Win10 - MySQL 5.7 忘记密码
  9. 用SharedPreference或文件的方式存储数据
  10. caffe调loss方法
  11. CDQ分治入门 + 例题 Arnooks&#39;s Defensive Line [Uva live 5871]
  12. Spring中的事务操作
  13. 第七次spring会议
  14. metamask源码学习-controller-transaction
  15. 题外话:Lua脚本语言存在的意义
  16. Android基础(五) Service全解析----看不见的Activity
  17. jquery如何让checkbox如何取消勾选
  18. EntityFramework Code First便捷工具——数据迁移
  19. FileZilla Server ftp 服务器下通过alias别名设置虚拟目录(多个分区)
  20. TED_Topic1:Why we need to rethink capitalism

热门文章

  1. Linux学习之路-2017/12/25
  2. AT89S52汇编实现l通过按键中断切换led灯的四种闪烁模式(单灯左移,单灯右移,双灯左移,双灯右移)
  3. python -wordcloudan云词安装
  4. Zepto&#30340;SwipeUp &#22312; android &#21644;&#24494;&#20449; &#30340;&#35299;&#20915;&#26041;&#26696;
  5. SQLServer------查询结果为空的列赋默认值
  6. css画图那些事
  7. 前端技术-HTML页面的加载
  8. Spring源码分析之IOC容器(一)
  9. 1202. [HNOI2005]狡猾的商人【贪心 或 并查集】
  10. Python学习之路 (二)爬虫(一)