约束4:唯一约束,Check约束和null
大家知道,关系型数据库的逻辑运算的结果是三值型的,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'))
参考文档:
table_constraint (Transact-SQL)
最新文章
- C语言atan2()函数:求y/x的反正切值
- sdust 2410 Mine Number
- Java(jdk1.7) 陷阱
- WdatePicker 控制选择范围
- HDOJ 3415 Max Sum of Max-K-sub-sequence(单调队列)
- 高级UNIX环境编程5 标准IO库
- post提交数据长度限制问题
- Win10 - MySQL 5.7 忘记密码
- 用SharedPreference或文件的方式存储数据
- caffe调loss方法
- CDQ分治入门 + 例题 Arnooks&#39;s Defensive Line [Uva live 5871]
- Spring中的事务操作
- 第七次spring会议
- metamask源码学习-controller-transaction
- 题外话:Lua脚本语言存在的意义
- Android基础(五) Service全解析----看不见的Activity
- jquery如何让checkbox如何取消勾选
- EntityFramework Code First便捷工具——数据迁移
- FileZilla Server ftp 服务器下通过alias别名设置虚拟目录(多个分区)
- TED_Topic1:Why we need to rethink capitalism
热门文章
- Linux学习之路-2017/12/25
- AT89S52汇编实现l通过按键中断切换led灯的四种闪烁模式(单灯左移,单灯右移,双灯左移,双灯右移)
- python -wordcloudan云词安装
- Zepto&#30340;SwipeUp &#22312; android &#21644;&#24494;&#20449; &#30340;&#35299;&#20915;&#26041;&#26696;
- SQLServer------查询结果为空的列赋默认值
- css画图那些事
- 前端技术-HTML页面的加载
- Spring源码分析之IOC容器(一)
- 1202. [HNOI2005]狡猾的商人【贪心 或 并查集】
- Python学习之路 (二)爬虫(一)