当前位置:文档之家› 第四章 实现数据的完整性

第四章 实现数据的完整性

下面的例子创建了一个 Products 表,定义了其中的列,并在列级和表级都 定义了约束。 USE Northwind CREATE TABLE dbo.Products ( ProductID int IDENTITY (1,1) NOT NULL, ProductName nvarchar (40) NOT NULL, SupplierID int NULL, CategoryID int NULL,
4.2 数据完整性类型
数据库设计时最重要的一步是确定用于强制数据完整性的最好方法。数据完 整性指的是存储在数据库中的数据的一致性和准确性。数据完整性分为以卞几 种。
1、域完整性(Domain integrity) 域 (或 列 )完 整 性 指 定 对 列 有 效 的 一 组 值 并 决 定 是 否 允 许 有 空 值 。通 过 使 用 有
约束是强制数据完整性的较好方法。本节讨论如何决定使用的约束类型,每 种约束强制哪种数据完整性和如何定义约束。
4.4.1 决定使用哪种约束类型
完整性类型 域
实体 参照
第 四 章 实 现 数 据 的 完 整 性 83
约束类型 DEFAULT CHECK REFERENTIAL PRIMARYKEY UNQUE FOREIGNKEY CHECK
4.5.1 DEFAULT 约束 当 INSERT 语 句 没 有 指 定 值 时 ,DEFAULT 约 束 在 列 中 输 入 值 。DEFAULT 约 束 强
制了域完整性。 部分语法 [CONSTRAINT contraint_name] DEFAULT contraint_expression 如果没有提供 contact name,下面的例子在 dbo.Customers 表中添加一个
的脚本。必须限制将过程完整性用于更复杂的商业逻辑和例外中,例如,想进行 级联删除时使用过程完整性。考虑以下关于过程完整性的事实:
通 过 使 用 其 他 编 程 语 言 和 工 具 ,可 以 在 客 户 机 和 服 务 器 上 实 现 过 程 完 整性。 通过使用触发器和存储过程可以实现过程完整性。
4.4 定义约束
4.4.3 使用约束的考虑 在实现或修改约束时应考虑以下因素: 不需要删除和重建表就可以创建、修改和删除约束。 必 须 在 应 用 程 序 和 事 务 处 理 中 建 立 错 误 检 查 逻 辑 ,以 检 测 约 束 是 否 被 侵害。 在向表中添加约束时,SQL Server 验证现有的数据。 在创建约束时可以对其进行命名,因为 SQL Server 提供了复杂的、 系 统 产 生 的 名 字 。对 数 据 库 对 象 的 所 有 者 来 说 ,名 字 必 须 是 唯 一 的 并 且遵从 SQL Server 的标识符规则。 为 了 得 到 约 束 的 帮 助 ,可 以 执 行 sp_helpconstraint 或 sp_help 系 统 存 储 过 程 , 或 查 询 信 息 规 划 视 图 ( information schema views), 例 如 check_constraint , referential_con现 数 据 的 完 整 性 81
第四章 实现数据的完整性
内容摘要 数据完整性的类型 强制数据的完整性 定义约束 约束的类型 使约束失效 使用默认值和规则 决定使用哪种强制方法
考点提示 定义各种类型的数据完整性 定义各种类型的约束 定义默认值和规则
4.1 数据完整性概述
本章讲述数据完整性的概念和可用于强制数据完整性的方法,确保数据完整 的主要方法——约束及其类型,以及如何创建和实现约束,在必要时如何使约束 失效。同时讨论强制数据完整性的其他两种可选择的方法——默认值和规则。
4.3 强制数据完整性
通过两种方式可以强制数据的完整性:声明的数据完整性和过程的数据完整 性。
4.3.1 声明数据完整性 使用声明数据完整性,可以定义标准规定数据必须作为对象定义的一部分,
然后 Microsoft SQL Server2000 自动确保数据符合该标准。实现基本数据完整 性的最好方法是使用声明的数据完整性。考虑以下事实:
插入 UNKNOWN 值的 DEFAULT 约束。 USE Northwind ALTER TABLE dbo.Customers ADD CONSTRAINT DF_contactname DEFAULT 'UNKNOWN' FOR ContactName 在使用 DEFAULT 约束时,考虑以下因素: DEFAULT 约束验证了表中现有的数据。 DEFAULT 约束只用于 INSERT 语句。 在每一个列上只能定义一个 DEFAULT 约束。 不能用于有 Identity 属性的列或具有 rowversion 数据类型的列。 允许一些系统提供的值——USERS,CURRENT_USER,SESSION USER, SYSTEM_USER 或 CURRENT_TIMESTAMP——用 DEFAULT 约束指定而不是 用户定义的值。这些系统提供的值可以用于提供插入数据的用户记 录。
效检查可以强制域完整性,也可以通过在一列中限定数据类型、格式和可能值的 范围来强制数据完整性。
2、实体完整性(Entity integrity) 实 体 (或 表 )完 整 性 要 求 表 中 所 有 的 行 具 有 唯 一 的 标 识 符 , 例 如 主 关 键 字
(primary key value)。主关键字是否可以改变或一整行是否可以删除,取决于 主关键字和其他表之间的完整性级别。
通 过 使 用 直 接 在 表 中 或 列 中 定 义 的 声 明 约 束 ,使 声 明 的 完 整 性 作 为 数 据库定义的一部分声明。 通过使用约束,默认值和规则实现声明完整性。
4.3.2 过程数据完整性 使 用 过 程 数 据 完 整 性 ,可 以 编 写 用 来 定 义 数 据 必 须 满 足 的 标 准 和 强 制 该 标 准
根 据 表 中 另 一 列 的 值 ,指 定 在 某 列 中 可 接 受 的 数值
4.4.2 创建约束 通过使用 CREATETABLE 语句或 ALTERTABLE 语句来实现约束。使用现有的数
据可以向表中添加约束。可以将约束放在单列或多列中,单列称为列级约束,多 列称为表级约束,尽管并没有涉及到表中所有的列。
约束是一种强制数据完整性的标准 ANSI 方法。每种数据完整性类型——域、 实体、参照完整性——使用不同的约束类型来进行强制。约束确保在列中输入有 效的值并维护表之间的关系。下表描述了不同的约束类型。
完整性类型 域
约束类型 DEFAULT
CHECK REFERENTIAL
描述 当 INSET 语句没有明确地提供值时,为列指定 值 指定在列中可接受的数值 根据另一表中的列值,指定更新可接受的数值
82 MCSE 2000 系列—SQL 2000 编程
3、参考完整性(References integrity) 参 考 完 整 性 确 保 维 持 主 关 键 字 (被 参 照 表 中 )和 外 部 关 键 字 (参 照 表 中 )的 关
系。如果有外部关键字提到了该行,在被参照表中的行不能被删除,也不能改变 主关键字,除非允许级联操作。可以在同一个表中或在独立的表之间定义参考完 整性。
实体 参照
PRIMARYKEY UNIQUE FOREIGNKEY CHECK
每行唯一的标识符——确保用户没有键入重复 的 值 并 且 创 建 了 索 引 来 增 强 性 能 。不 允 许 有 空 值 不 允 许 复 制 可 选 (非 主 )关 键 字 , 并 且 确 保 创 建
索引来增强性能。允许有空值 定义列或列组合的值,以匹配同一个表或另一 表中的关键字
第 四 章 实 现 数 据 的 完 整 性 85
QuantityPerUnit nvarchar (20) NULL, UnitPrice money NULL CONSTRAINT DF_Products_UnitPrice DEFAULT(0), UnitsInStock smallint NULL CONSTRAINT DF_Products_UnitsInStock DEFAULT(0), UnitsOnOrder smallint NULL CONSTRAINT DF_Products_UnitsOnOrder DEFAULT(0), ReorderLevel smallint NULL CONSTRAINT DF_Products_ReorderLevel DEFAULT(0), Discontinued bit NOT NULL CONSTRAINT DF_Products_Discontinued DEFAULT(0), CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (ProductID), CONSTRAINT FK_Products_Categories FOREIGN KEY (CategoryID) REFERENCES dbo.Categories (CategoryID) ON UPDATE CASCADE, CONSTRAINT FK_Products_Suppliers FOREIGN KEY (SupplierID) REFERENCES dbo.Suppliers (SupplierID) ON DELETE CASCADE, CONSTRAINT CK_Products_UnitPrice CHECK (UnitPrice >= 0), CONSTRAINT CK_ReorderLevel CHECK (ReorderLevel >= 0), CONSTRAINT CK_UnitsInStock CHECK (UnitsInStock >= 0), CONSTRAINT CK_UnitsOnOrder CHECK (UnitsOnOrder >= 0) ) GO
86 MCSE 2000 系列—SQL 2000 编程
相关主题