在使用SqlServer中我们经常需要用到约束的概念,所谓约束,就是对数据表的字段的值进行约束,让其值在可以掌握的范围之内。这只是约束这个概念的功能性的问题,但是我们在使用约束的时候常常要做到“适可而止”。因为一旦添加了约束,那么我们在添加数据或者更新数据的时候往往就多了数据库就多了一层检查操作,因为数据库程序需要检查我们添加或修改的数据是否符合此约束,这样势必就在一定程度上降低了程序的性能。
所以,在不是一定需要约束的地方建议不要随意的添加约束。
常见的约束有:主键约束,外键约束,默认值约束,唯一性约束,非空约束等等,下面我们一个个的讲解。
一,主键约束(primary key)
主键约束常常在我们创建表的时候就已经为表制定了主键的,其作用就是为表添加主键,但是有时候我们也可以在已经有的表中添加主键约束。
(1)案例一:在表创建的时候就指定主键约束,比如我们创建一个Student表,为其StuId字段添加主键约束
代码:
create table Student(StuId int identity(1,1) primary key not null,StuName nvarchar(10) null,StuSex nchar(1) null,StuAge int null)
以上代码我们便创建了一个Student表(包含字段StuId,StuName,StuSex,StuAge)并且设置了StuId为主键。
(2)案例二,先创建表,然后为表的字段添加主键约束,比如我们先创建一个Student表,然后再为表的StuId字段添加主键约束
代码:
--第一步,创建Student表
create table Student(StuId int identity(1,1) not null,StuName nvarchar(10),StuSex nchar(1) null,StuAge int null)
--第二步,为Student表的StuId字段添加主键约束
alter table Student add constraint PK_Student_StuId primary key(StuId)
通过以上两句代码便创建了表和添加了主键约束,在后添加主键约束的时候主键约束名的规则是以PK开头(primary key的简写)加“_”然后是表名,然后再“_”然后是添加约束的字段名。这个约定不是强制性,只是这是一个比较规范的约束命名规则。
二,外键约束
外键约束是用于在两个表之间建立外键关系,就比如,我们有两个表,一个商品表,一个商品分类表,商品表里面有对应商品分类表的字段(外键),即某个商品属于某个分类,这样两个表之间就存在了一种联系,而这种练习我们可以通过外键约束进行约束,以确保我们为商品表添加的每个商品数据都能在商品分类表中有某个分类与其对应。
案例:创建商品表和商品分类表,并未商品表添加外键约束对应商品分类表
--第一步,创建商品分类表
create table ProCategory(cateId int identity(1,1) not null,cateName nvarchar(8) null,parentCate int null)
--第二步,创建商品表
create table Product(ProId int identity(1,1) not null,ProName,cateId)
--第三步,为商品分类表添加主键约束
alter table ProCategory add constraint PK_ProCategory_cateId primary key(cateId)
--第四步,为商品表添加外键约束关联商品分类表的主键
alter table Product add constraint FK_Product_ProCategory foreign key(cateId) references ProCategory(cateId)
通过以上代码我们便创建了表,并且为商品表添加了外键约束,添加了约束之后在我们为商品表添加数据的时候如果cateId字段的值在商品分类表中的cateId字段不存在的时候就会报错,因为我们通过外键约束约束了商品表cateId字段的值。
有一个问题,为什么我们需要为商品分类表添加主键约束呢,而不是直接约束约束cateId字段呢,因为外键约束只能关联另外一个表的主键,而不是其他的字段。
三,默认值约束(default)
我们值约束可以约束表中一个字段的默认值,这样我们在添加数据的时候如果没有为该字段赋予数据的话系统会使用默认值约束的数据。
案例:我们做一个用户建议表,既然是建议信息就存在实名建议和非实名建议,我们通过默认值约束约束如果我们在添加意见数据的时候没有赋予提供建议的用户字段姓名的时候默认为“佚名”。
(代码1)在创建表的时候就添加默认值约束
create table SuggestInfo (Id int identity(1,1) primary key not null,SugName nvarchar(8) default(N'佚名') not null,SugContent nvarchar(128) null)
以上代码我们创建的用户建议表(SuggestInfo)并设计了三个字段:编号(Id)、建议人姓名(SugName)、建议内容(SugContent),并且在创建表时便为SugName字段添加了默认值约束,约束的值为“佚名”。
(代码2)先创建表,然后添加默认值约束
--第一步,创建用户建议表
create table SuggestInfo(Id int identity(1,1) primary key not null,SugName nvarchar(8) not null,SugContent nvarchar(128) null)
--第二步,为用户建议表的SugName字段添加默认值约束,默认值为“佚名”
alter table SuggestInfo add constraint DF_SuggestInfo_SugName default(N'佚名') for SugName
四,唯一性约束
唯一性约束很容易理解,就是约束一个字段的值在表内不能够重复,都是唯一的。
(案例)还是以用户建议表为例,我们约定用户建议表的建议内容不能够重复
(代码)
--第一步,创建用户建议表
create table SuggestInfo(Id int identity(1,1) primary key not null,SugName nvarchar(8) not null,SugContent nvarchar(128) null)
--第二步,为用户建议表的SugContent字段添加唯一键约束
alter table SuggestInfo add constraint UN_SuggestInfo_SugContent unique(SugContent)
五,非空约束
其实在上面的例子中我们都增加了非空约束,再创建表的时候有些字段后面的“not null”其实就是非空约束,约束该字段的值不能为null。这里就不再写例子了。