数据表的完整性问题大多是由于设计不当引起的,创建表的时候就应当保证以后的录入是正确的,也就是错误的、不符合要求的数据应当不允许录入。
数据完整性=可靠性+精确性
要保证数据的完整性,就要实施完整性约束。
四种完整性约束
①域完整性:列值的约束,如数据类型、位数、范围。
约束方法:检查约束、默认值约束、非空约束。
②实例完整性:行和行间不能重复。
约束方法:唯一约束、主键约束、标识列。
③引用完整性:某一列值需来源于另外一张表中。
约束方法:外键约束。
④自定义完整性:自己定义的一些约束。
约束方法:触发器。
表中字段的常用数据类型
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之间(检查约束):