接上一篇的Sql Server约束学习一(主键约束、外键约束、唯一约束)
4、检查约束
1)检查约束的定义
检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值,只有这些列都在同一个表中,以及值是在更新或插入的同一行中。检查约束还可以用于检查列值组合是否满足某一个标准。可以使用where子句一样的规则来定义检查约束。
检查约束条件示例如下:
2)检查约束的创建
2.1)在创建表时创建检查约束
/**创建表时创建检查约束***/
--创建学生表--
create table Student(
Uid int not null identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
Age int not null check(Age>=18), --检查约束--
TeaUid int not null foreign key references Teacher(Uid), --外键约束--
Notes varchar(100) null
)
执行后,结果如下图:
2.2)在已生成表新增检查约束
/**创建表后,新增检查约束***/
--创建学生表--
create table Student(
Uid int not null identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
Age int not null, --检查约束--
TeaUid int not null foreign key references Teacher(Uid), --外键约束--
Notes varchar(100) null
)
--创建表后,新增检查约束--
alter table Student
add constraint CK_Student_Age
check(Age>=18) --年龄大于等于18岁
执行后,结果如下图所示:
3)检查约束的验证
--添加符合检查条件的信息--
insert into Student(Name,Age,TeaUid) values('张小飞',18,2)
--添加不符合检查条件的信息--
insert into Student(Name,Age,TeaUid) values('李小菲',16,2)
--查询学生表信息--
select * from Student
执行后,结果如下图:
5、默认约束
1)默认约束的定义
默认约束也是表定义的一个组成部分,它定义了当插入的行对于定义了默认约束的列未提供相应数据是该怎么办。可以定义一个字面值(年龄默认为0)或系统值(getdate())等。
默认约束的特性:
(1) 默认值只在insert语句中使用,在update、delete语句被忽略
(2)如果在insert语句提供任意值,那就不使用默认值,若该列不提供值,则使用默认值
2)默认约束的创建
2.1)创建表时创建默认约束
/***在创建表时创建默认约束***/
--创建People表--
create table People(
Uid int identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
HomeAdress varchar(50) not null default'未填写', --默认约束--
Notes varchar(100) null
)
执行后,结果如下图:
2.2) 创建表后,添加默认约束
/***在创建表后添加默认约束***/
--创建People表--
create table People(
Uid int identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
HomeAdress varchar(50) not null, --默认约束--
Notes varchar(100) null
)
--添加默认约束--
alter table People
add constraint DF_People_HomeAddress
default '未填写' for HomeAdress
执行后,结果如下图:
3)默认约束的验证
--不提供地址的新增信息--
insert into People values('张三')
--提供地址的新增信息--
insert into People(Name,HomeAdress) values('李四','广州市海珠区')
--查询People表--
select * from People
执行后,结果如下图:
6、禁用约束
1)禁用约束定义
有时我们想暂时或永久消除约束,但sql server并没有提供删除约束的方法,只允许禁用外键约束或检查约束,不能禁用主键约束和唯一约束,而同时保持约束的完整性。
禁用一个数据完整性规则通常是因为有无效数据了,这样的数据分为两类:
(1)在创建约束时已经存在数据库中的数据
(2)约束创建之后希望添加的数据
注:sql server允许禁用完整性检查一段时间来例外的无效数据做处理,然后重新启用完整性。
2)禁用约束创建
2.1)创建约束时,忽略之前不满足数据
--创建People表--
create table People(
Uid int identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
Age int not null,
Notes varchar(100) null
)
--添加年龄小于18岁数据--
insert into People(Name,Age) values('小风',12)
--查询People表--
select * from People
未加检查约束,执行之后,结果如下:
当我们执行添加检查约束,发现添加不了
--添加年龄必须大于等于18岁检查约束--
alter table People
add constraint CK_People_Age
check(Age>=18)
执行之后,结果如下图:
那么如何忽略之前不满足的数据呢?
--添加年龄必须大于等于18岁检查约束--
alter table People
with nocheck --不检查之前数据
add constraint CK_People_Age --检查约束
check(Age>=18)
执行后,结果如下图:
添加大于18岁记录
--添加大于18岁记录--
insert into People(Name,Age) values('小溪',20)
--查询People表--
select * from People
执行后,结果如下图:
2.2)临时禁用已存在的约束
当我们需要从另一数据库中导入数据到表中,而表中已建立了约束的时候,可能会存在一些数据和规则不匹配。当然有一个解决方式是先删除约束,添加需要的数据,
然后with nocheck 在添加回去。但是这样做太麻烦了。我们不需要这么做。我们可以采用名为nocheck的选项来运行alter语句,这样就能够取消需要的约束。
如之前创建检查约束是这样的
--添加年龄必须大于等于18岁检查约束--
alter table People
add constraint CK_People_Age --检查约束
check(Age>=18)
那么要取消检查约束可以这样
--取消之前创建的检查约束--
alter table People
nocheck constraint CK_People_Age
我们来测试临时禁用已存在的约束
假如我们创建检查约束是这样的
--创建People表--
create table People(
Uid int identity(1,1) primary key, --主键约束--
Name varchar(20) not null unique, --唯一约束--
Age int not null,
Notes varchar(100) null
)
--添加年龄必须大于等于18岁检查约束--
alter table People
add constraint CK_People_Age --检查约束
check(Age>=18)
当执行不符合检查约束条件语句时
--执行不满足条件的添加信息--
insert into People(Name,Age) values('张之洞',17)
返回结果如下图:
执行临时禁用检查约束,结果如何呢?
--取消之前创建的检查约束--
alter table People
nocheck constraint CK_People_Age
--执行不满足条件的添加信息--
insert into People(Name,Age) values('张之洞',17)
--查询People表信息--
select * from People
执行后,结果如下图:
3)约束是否启用或关闭
3.1)如何查看约束是否启用
--查询People表的约束状态--
sp_helpconstraint People
查询结果如下:
3.2)如何启用或关闭约束
--关闭检查约束--
alter table People
nocheck constraint CK_People_Age
--启用检查约束--
alter table People
check constraint CK_People_Age
--执行查询People约束--
sp_helpconstraint Peopl
执行结果如下:
注:status_enabled的两种状态如下: (1)Enabled:启用 (2)Disabled:禁用
学习网址: