数据完整性
强制数据完整性可保证数据库中数据的质量。
1.实体完整性
实体完整性将行定义为特定表的唯一实体。
实体完整性通过 UNIQUE 索引、UNIQUE 约束或 PRIMARY KEY 约束,强制表的标识符列或主键的完整性。
2.域完整性
完整性指特定列的项的有效性。
您可以强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用 CHECK 约束和规则)或限制可能值的范围(通过使用 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。
3.引用完整性
输入或删除行时,引用完整性保留表之间定义的关系。
在 SQL Server 中,引用完整性通过 FOREIGN KEY 和 CHECK 约束,以外键与主键之间或外键与唯一键之间的关系为基础。引用完整性确保键值在所有表中一致。
这类一致性要求不引用不存在的值,如果一个键值发生更改,则整个数据库中,对该键值的所有引用要进行一致的更改。
强制引用完整性时,SQL Server 将防止用户执行下列操作:
a.在主表中没有关联行的情况下在相关表中添加或更改行。
b.在主表中更改值(可导致相关表中出现孤立行)。
c.在有匹配的相关行的情况下删除主表中的行。--这个特点可以保护你的一些重要表不被误删
--测试
if OBJECT_ID('tb1') is not null
drop table tb1
go
create table tb1 (a int primary key ,value int)
insert tb1 select 1,1
union select 2,23
union select 3,32
go
if OBJECT_ID('tb2') is not null
drop table tb2
go
create table tb2 (a int references tb1(a),value int)
insert tb2 select 1,4
go
--测试:向TB2中加入TB1中没有的A值
insert tb2 select 6,4
/*INSERT 语句与FOREIGN KEY 约束"FK__tb2__a__2E1BDC42"冲突。该冲突发生于数据库"tempdb",表"dbo.tb1", column 'a'*/
--测试:删除TB1中的a值为的行,使TB2中值为的行孤立
delete tb1 where a=1
/*INSERT 语句与FOREIGN KEY 约束"FK__tb2__a__2E1BDC42"冲突。该冲突发生于数据库"tempdb",表"dbo.tb1", column 'a'*/
--测试:假设我们的TB1非常重要,而设置了TB2作为它的外表,这样可以起到保护TB1被误删的可能
drop table tb1
/*无法删除对象'tb1',因为该对象正由一个FOREIGN KEY 约束引用*/