数据完整性概念 数据完整性是指数据的正确性和完备性。在用I N S E RT、D E L E T E、U P D AT E语句修改数 据库内容时,数据的完整性可能会遭到破坏,例如: • 无效的数据被添加到数据库中。如:某定单所指的产品不存在。 • 对数据库的修改不一致,如:为某产品增加了一份定单,但却没有调整产品的库存信 息。 • 将存在的数据修改为无效的数据,如:将某学生的班号修改为并不存在的班级。 为了保证存放的数据的一致性和正确性, SQL Server对关系施加了一个或多个数据完整 性约束。这些约束限制了数据库的数据值,或者限制了数据库修改所产生的数据值,或者限 制了对数据库中某些值的修改。在关系数据库中,主要有以下3类数据完整性: 1. 实体完整性 保证表中所有的行唯一。也就是说,表中的主键在所有记录上必须取值唯一,和其他记 录上的值不同。如: t i t l e表中的t i t l e _ i d取值唯一,它们唯一标志了相应记录所代表的书,重复 的值是非法的,因为重复的书号将造成书表达的混乱,不能将不同的书区别开来。 2. 参照完整性 主键和外键关系维护。它涉及两个或两个以上表的数据的一致性维护。外键值将子表中 包含此外键的记录和父表中包含的相匹配主键值的记录关联起来。在l i b r a r y数据库中,l o a n表中m e m b e r _ n o列将记录所描述的借书信息和它所借的书联系起来, m e m b e r _ n o必须是包含在m e m b e r表的m e m b e r _ n o列中的有效值,否则,借书的人根本就不存在。 SQL Server提供了外键/主键值约束。即满足以下2点: • 存在外键时,被参照表中这一行不能删除,主键值不变。也即:删除父表中的记录或更 新父表中的主关键值,必须保证没有相同的外键值存在,否则,不允许删除或修改。 如:在p u b s数据库中,加到t i t l e s表中的每本书,必须由合法的出版社出版。如果在t i t l e s表 中有某一出版社出版的书存在,就不能从p u b l i s h e r s表中删除这个出版社的信息或更改这个出版社的标志p u b _ i d。 • 若在被参照表中不存在包含相应主键的行时,一个外键值不能插入到参照表中。也即: 向子表插入记录或更新子表中外键值的前提是,必须保证这个外键值与主表中主键的某 个值相等或者该外键值为空,否则不允许插入或修改。 如:在p u b s数据库中,添加到t i t l e s表中的每本书,必须由合法的出版社出版。如果插入到t i t l e s表的数据中的出版社在p u b l i s h e r s表中不存在,那么就不能往t i t l e s表添加这行记录。 3. 域完整性 即为某列有效值的集合,是对业务管理或是对数据库数据的限制,他们反映业务的规则。 域完整性也叫作商业规则( business rule)。如:在定单系统中,禁止接受库存中没有足够数 量的产品定单。SQL Server能够检查每个添加到定单表中的新记录,以确信o t y列中的值不违 反这个商业规则。又如,规定定单的最小金额不低于2 0 0元。 除了上述的3个完整性要求外,其实还存在1个数据完整性约束: 强制数据( required data):数据库中的某些列在每个记录上必须存在有效值,不允许有 空值出现。如:l o a n表中的m e m b e r _ n o必须非空,这是因为每份借书记录都必须有与之相关的借书人。这是最简单的数据完整性约束。可在建表时将该列声明为NOT NULL即可。 在SQL Server中,在已存在的表中无法增加NOT NULL约束。这是由实现空值的内部机 制决定的。一般而言, SQL Server为所有记录上允许空值的列都保留了一个额外的字节,作 为空值指示器,当列为空值时,该额外字节被设定为某个特定值;当列被指定为NOT NULL 特性时,SQL Server不为此列分配空值指示字节,以节省磁盘空间。 8.2 实施方法 共有以下两种方法实现数据完整性。 • 过程型数据完整性:由缺省、规则和触发器实现。由视图和存储过程支持。 • 声明型数据完整性:作为数据库说明的一部分在语法中实现,是在C R E ATE TA B L E和 A LTER TA B L E定义中使用c o n s t r a i n t和d e f a u l t语句限制表中的值。使用这种方法实现数 据完整性简单且不容易出错,系统直接将实现数据完整性的要求定义在表和列上。 在create table和alter table语句中,约束子句有: 缺省约束(default constraints):当向数据库中的表插入数据时,如果用户没有明确给出 某列的值, SQL Server自动为该列输入指定值。 检查约束( check constraints):限制插入列中的值。 唯一约束( unique constraints):要求表中在指定的列上没有两行具有相同的值。 主键约束( primary key constraints):要求主键的列上没有两行具有相同值,也没有空值。 参照约束( reference constraints)/外键约束( foreign key constraints ):要求指定的列 (外键)中正被插入或更新的新值,必须在被参照表(主表)的相应列(主键)中已经存在。 约束又分为列级约束和表级约束。如果约束只对一列起作用,应定义为列级约束,如果 约束对多列起作用,则应定义为表级约束
数据完整性概念
数据完整性是指数据的正确性和完备性。在用I N S E RT、D E L E T E、U P D AT E语句修改数
据库内容时,数据的完整性可能会遭到破坏,例如:
• 无效的数据被添加到数据库中。如:某定单所指的产品不存在。
• 对数据库的修改不一致,如:为某产品增加了一份定单,但却没有调整产品的库存信
息。
• 将存在的数据修改为无效的数据,如:将某学生的班号修改为并不存在的班级。
为了保证存放的数据的一致性和正确性, SQL Server对关系施加了一个或多个数据完整
性约束。这些约束限制了数据库的数据值,或者限制了数据库修改所产生的数据值,或者限
制了对数据库中某些值的修改。在关系数据库中,主要有以下3类数据完整性:
1. 实体完整性
保证表中所有的行唯一。也就是说,表中的主键在所有记录上必须取值唯一,和其他记
录上的值不同。如: t i t l e表中的t i t l e _ i d取值唯一,它们唯一标志了相应记录所代表的书,重复
的值是非法的,因为重复的书号将造成书表达的混乱,不能将不同的书区别开来。
2. 参照完整性
主键和外键关系维护。它涉及两个或两个以上表的数据的一致性维护。外键值将子表中
包含此外键的记录和父表中包含的相匹配主键值的记录关联起来。在l i b r a r y数据库中,l o a n表中m e m b e r _ n o列将记录所描述的借书信息和它所借的书联系起来, m e m b e r _ n o必须是包含在m e m b e r表的m e m b e r _ n o列中的有效值,否则,借书的人根本就不存在。
SQL Server提供了外键/主键值约束。即满足以下2点:
• 存在外键时,被参照表中这一行不能删除,主键值不变。也即:删除父表中的记录或更
新父表中的主关键值,必须保证没有相同的外键值存在,否则,不允许删除或修改。
如:在p u b s数据库中,加到t i t l e s表中的每本书,必须由合法的出版社出版。如果在t i t l e s表
中有某一出版社出版的书存在,就不能从p u b l i s h e r s表中删除这个出版社的信息或更改这个出版社的标志p u b _ i d。
• 若在被参照表中不存在包含相应主键的行时,一个外键值不能插入到参照表中。也即:
向子表插入记录或更新子表中外键值的前提是,必须保证这个外键值与主表中主键的某
个值相等或者该外键值为空,否则不允许插入或修改。
如:在p u b s数据库中,添加到t i t l e s表中的每本书,必须由合法的出版社出版。如果插入到t i t l e s表的数据中的出版社在p u b l i s h e r s表中不存在,那么就不能往t i t l e s表添加这行记录。
3. 域完整性
即为某列有效值的集合,是对业务管理或是对数据库数据的限制,他们反映业务的规则。
域完整性也叫作商业规则( business rule)。如:在定单系统中,禁止接受库存中没有足够数
量的产品定单。SQL Server能够检查每个添加到定单表中的新记录,以确信o t y列中的值不违
反这个商业规则。又如,规定定单的最小金额不低于2 0 0元。
除了上述的3个完整性要求外,其实还存在1个数据完整性约束:
强制数据( required data):数据库中的某些列在每个记录上必须存在有效值,不允许有
空值出现。如:l o a n表中的m e m b e r _ n o必须非空,这是因为每份借书记录都必须有与之相关的借书人。这是最简单的数据完整性约束。可在建表时将该列声明为NOT NULL即可。
在SQL Server中,在已存在的表中无法增加NOT NULL约束。这是由实现空值的内部机
制决定的。一般而言, SQL Server为所有记录上允许空值的列都保留了一个额外的字节,作
为空值指示器,当列为空值时,该额外字节被设定为某个特定值;当列被指定为NOT NULL
特性时,SQL Server不为此列分配空值指示字节,以节省磁盘空间。
8.2 实施方法
共有以下两种方法实现数据完整性。
• 过程型数据完整性:由缺省、规则和触发器实现。由视图和存储过程支持。
• 声明型数据完整性:作为数据库说明的一部分在语法中实现,是在C R E ATE TA B L E和
A LTER TA B L E定义中使用c o n s t r a i n t和d e f a u l t语句限制表中的值。使用这种方法实现数
据完整性简单且不容易出错,系统直接将实现数据完整性的要求定义在表和列上。
在create table和alter table语句中,约束子句有:
缺省约束(default constraints):当向数据库中的表插入数据时,如果用户没有明确给出
某列的值, SQL Server自动为该列输入指定值。
检查约束( check constraints):限制插入列中的值。
唯一约束( unique constraints):要求表中在指定的列上没有两行具有相同的值。
主键约束( primary key constraints):要求主键的列上没有两行具有相同值,也没有空值。
参照约束( reference constraints)/外键约束( foreign key constraints ):要求指定的列
(外键)中正被插入或更新的新值,必须在被参照表(主表)的相应列(主键)中已经存在。
约束又分为列级约束和表级约束。如果约束只对一列起作用,应定义为列级约束,如果
约束对多列起作用,则应定义为表级约束