数据完整性是指数据的正确性、一致性和安全性,它是衡量数据库中数据质量好坏的重要标准。当用户用INSERT、DELETE或UPDATE语句修改数据库内容时,数据的完整性就可能会遭到破坏。例如可能会出现下列情况:将无效的数据添加到数据库的表中,如产品的价格输入成负数;将存在的数据修改为无效的数据,如将Orders表中的SaleID修改为并不存在的销售员号;对数据库的修改不一致,如在产品表中修改了ProductID,但在OrderDetail表中的ProductID却没有得到修改等。
为了解决这些问题,保证数据的完整性,SQL Server提供了实施数据完整性的方法,包括约束、缺省、规则等。在SQL Server数据库中,数据完整性大致可划分为以下4种类型:
1.实体完整性(entity integrity)
实体完整性是指表中的每一行都能由称为主键的属性列来唯一标识,且不存在重复的数据行。作为唯一标识符的主键可能是一列,也可能是几列的组合,并且主键不可为空。
例如,在Seller表中可能由两个或多个销售员都叫‘张芳’,因此SaleName字段不能设为主键。给每一个销售员赋予唯一编码SaleID来标识他们,SaleID字段为主键。
2.域完整性(domain integrity)
域完整性是指限制向表中输入的值的范围,保证给定列的输入有效性。它可以通过限制数据类型、值域或数据格式来实现。
例如,销售员的性别只能是“男”或“女”,年龄必须在18~60岁之间,产品的价格不可能为负数等。
3.参照完整性(referential integrity)
参照完整性也叫引用完整性,是指当一个表引用了另一个表中的某些数据时,要防止非法的数据更新,以保持表格间数据的一致性。
例如,如果产品“p01003”被定购,在OrderDetail表中有一行表示××订单订购了“p01003”产品,订购数量为××,那么这个产品的代码必须存在于Product表中。这是为了保证订单只对可供应的产品有效,并且如果产品数据发生了变化,那么在OrderDetail表中的数据也将相应地发生变化。如果要删除某个Product.ProductID,则对应的OrderDetail.ProductID也将被全部删除,或者在存在对应的OrderDetail.ProductID的前提下,不允许删除该Product.ProductID。
参照完整性可通过外键约束来实现,如图3-55所示。
4.用户定义完整性
用户定义完整性主要是体现实际运用的业务规则。它可以通过前面3种完整性的实施得到维护。