04、SQL Server 基础 - 使用SSMS创建数据库表并完善表结构

数据表的完整性问题大多是由于设计不当引起的,创建表的时候就应当保证以后的录入是正确的,也就是错误的、不符合要求的数据应当不允许录入。

数据完整性=可靠性+精确性

要保证数据的完整性,就要实施完整性约束。

四种完整性约束

①域完整性:列值的约束,如数据类型、位数、范围。

约束方法:检查约束、默认值约束、非空约束。

②实例完整性:行和行间不能重复。

约束方法:唯一约束、主键约束、标识列。

③引用完整性:某一列值需来源于另外一张表中。

约束方法:外键约束。

④自定义完整性:自己定义的一些约束。

约束方法:触发器。

表中字段的常用数据类型

 

char(x)指定的位数x,即使存入的数据不满x位,后面也会补上空格。varchar(x)则会判断位数,不足x则只保存真实的位数,牺牲性能来节省空间,而且因没有补全机制而更方便处理。

varchar(2x)能存储2x个字母或x个汉字,而nvarchar(2x)能存储2x个字母或2x个汉字。

 

日期类型:

 

此外,图片可以使用img类型。但是一般不把图片存在数据库中,而是直接保存在硬盘中,在数据库中记录它们的位置即可。

主键约束

 

因为学号是不可能重复的,就可以用它来保证实例的完整性,对学号设置主键约束:

 

尝试插入学号重复的行,会提示违反了主键约束,不能插入:

 

一个表可以有多个主键,按住Ctrl选中再一起设置主键,如新建这样一张表:

 

像这样的表就仅当两个主键都重复的行不能被录入:

 

在设计主键时,应尽量选择更新情况少的列的单个键作为主键。

默认值约束

如给Adress域设置默认值:

 

这时新插入的行不填入地址时,默认就不再为NULL而是提供的默认值:

 

设置标识列

如果表中没有合适的列作为主键,那么可以设置标识列:

 

标识列必须是int型,图中的设置表示标识从1开始,每次加1。把标识列设置成主键,然后保存设计并插入数据:

 

可以看到这时候主键就变成了标识列,且标识列由系统自动录入。但标识号不会因为删除行而回退,而是接着最后一次产生的标识(而不是实际紧靠的标识)向下走。

外键约束

创建好的学生表:

 

创建好的年级表:

 

创建好的科目表:

 

创建好的成绩表:

 

为保证数据完整性,成绩表中的学号应该来自学生表中的学号,成绩表中的学科号应来自科目表中的学科号,科目表中的年级号应来自年级表,学生表中的年级号应来自年级表。这就需要建立外键约束(保证引用的完整性)。

如添加”成绩表中的学号引用自学生表中的学号”:

 

 

 

用同样的方法建立另外两个外键约束。

建立好后插入数据,Grade表:

 

Subject表中GradeID不符合时不录入:

 

Result表中SubjectID不符合时不录入:

 

Result表中StudentNo不符合时不录入:

 

Student表中GradeID不符合时不录入:

 

建立外键约束后,需要注意:①主表中没有的值不能给子表外键约束域,②不能更改主表中的值使子表外键约束域孤立,应当一起修改,③子表中引用的了的值,不能在主表中删除这一行,④删除主表前,应先删除子表。

检查约束

 

 

 

这时候如果尝试录入的Email地址中未能按照CHECK约束包含有’@’符号,就会被禁止:

 

创建数据库关系图

 

 

 

继续完善这几张表

Student表密码长度>=6(检查约束):

 

Student表性别只能写男或女(检查约束):

 

Subject表学时必须大于0(检查约束):

 

Result表分数不为空时需要在0~100之间(检查约束):