数据完整性

1 数据完整性的概念

观察并分析如下示例数据表中的数据:
在这里插入图片描述
总结分析:

  • 当前表中存在不准确、不一致的数据,数据库失去了完整性;
  • 数据完整性破坏一般由数据库的设计不合理导致,应避免出现。

数据完整性的概念: 能确保存储在数据库中数据的准确性和一致性。


2 完整性约束的类型

常用三种类型的约束保证数据的完整性,如下:

  • 域(列)完整性:保证列值符合规定要求。
  • 实体完整性:要求表中所有行唯一。
  • 引用完整性:要求两表相同字段具有一致性。
    在这里插入图片描述

2.1 实体完整性

作用: 保证实体具有唯一标识。
方法: 主键约束、标识列、唯一约束。

添加约束的基本方法: alter table 表名 add constraint 约束名 约束类型 具体的约束说明

约束名的取名规则推荐采用: 约束类型_约束字段。

  • 主键(Primary Key)约束:如PK_StudentId
  • 唯一(Unique Key)约束:如UQ_StudentIdNo

创建主键约束和唯一约束:

use StudentManageDB
go

--创建主键约束
if exists(select * from sysobjects where name='pk_StudentId')
alter table Students drop constraint pk_StudentId
alter table Students add constraint pk_StudentId primary key(StudentId)

--创建唯一约束
if exists(select * from sysobjects where name='uq_StudentIdNo')
alter table Students drop constraint uq_StudentIdNo
alter table Students add constraint uq_StudentIdNo  unique(StudentIdNo)

2.2 域完整性

作用: 保证实体属性值符合规范要求。
方法: 检查约束(包括检查约束和默认约束)、限制数据类型、默认值、非空约束。

约束的取名规则:

  • 检查(Check Key)约束:如CK_Age。
  • 默认(Default Key)约束:如DF_StudentAddress。

创建检查约束与默认约束:

--创建检查约束
if exists(select * from sysobjects where name='ck_Age')
alter table Students drop constraint ck_Age
alter table Students add constraint ck_Age  check(Age between 18 and 25)

if exists(select * from sysobjects where name='ck_PhoneNumber')
alter table Students drop constraint ck_PhoneNumber
alter table Students add constraint ck_PhoneNumber  check(len(PhoneNumber)=11)

if exists(select * from sysobjects where name='df_StudentAddress')
alter table Students drop constraint df_StudentAddress
alter table Students add constraint df_StudentAddress default('地址不详') for StudentAddress

insert into Students (StudentName,Gender,Birthday,Age,StudentIdNo ,PhoneNumber,
StudentAddress,ClassId)
values('李小璐','女','1989-01-12',24,120229198901121315, '13099012876',default,1)

insert into Students (StudentName,Gender,Birthday,Age,StudentIdNo ,PhoneNumber,
ClassId)
values('李小璐','女','1989-01-12',24,120229198901121316, '13099012876',1)

2.3 引用完整性

作用: 保证两表中相同属性值的一致性。
在这里插入图片描述
方法: 外键约束。

约束名的取名规则:

  • 外键(Foreign Key)约束:如FK_ClassId
--创建外键约束
insert into StudentClass (ClassId,ClassName) values(1,'软件1班')
if exists(select * from sysobjects where name='fk_ClassId')
alter table Students drop constraint fk_ClassId
alter table Students add constraint fk_ClassId  foreign key (ClassId) references StudentClass(ClassId)

3 数据完整性总结

实体完整性:

  • 能够唯一标识表中的每一条记录。
  • 实现方式:主键、唯一键、IDENTITY属性。

域完整性:

  • 表中特定列数据的有效性,确保不会输入无效的值。
  • 实现方式:数据类型限制、缺省值、非控值。

引用完整性:

  • 维护表间数据的有效性、完整性。
  • 实现方式:建立外键,关联另一表的主键。

4 数据表的使用总结

主键的选择:

  • 最少性原则:尽量选择单个键作为主键。
  • 稳定性原则:尽量选择数值更新少的列作为主键。

外键使用:

  • 要求数据类型、数据长度必须与对应的主键表字段完全一致(命名也建议一致)。
  • 添加数据时,要首先添加主键表,再添加外键表。
  • 删除数据时,要首先删除外键表数据,再删除主键表数据。

完整数据库的创建步骤:
在这里插入图片描述

插入数据的过程:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SlowIsFastLemon/article/details/87929718