1、第 8 章 数据完整性本章内容8.1 数据完整性概述8.2 使用规则实施数据完整性8.3 使用默认值实施数据完整性8.4 使用约束实施数据完整性8.1 数据完整性概述数据完整性防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据完整性有 4 种类型:实体完整性(Entity Integrity) 、域完整性(Domain Integrity)、参照完整性(Referential Integrity) 、用户定义的完整性(User-defined Integrity)。在 SQL Server 中可以通过各种规则 (Rule)、默认(Default)
2、 、约束(Constraint)和触发器(Trigger)等数据库对象来保证数据的完整性。8.2 使用规则实施数据完整性8.2.1 创建规则8.2.2 查看和修改规则8.2.3 规则的绑定与松绑8.2.4 删除规则8.2.1 创建规则规则(Rule) 就是数据库中对存储在表的列或用户定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则和约束可以同时使用,表的列可以有一个规则及多个约束。规则与检查约束在功能上相似,但在使用上有所区别。检查约束是在 CREATE TABLE 或 ALTER TABLE 语句中定义的,嵌入了被定义的表结构,即删除表的时候检查约束也就随之被删除。而规
3、则需要用 CREATE RULE 语句定义后才能使用,是独立于表之外的数据库对象,删除表并不能删除规则,需要用 DROP RULE 语句才能删除。相比之下,使用在 CREATE TABLE 或 ALTER TABLE 语句中定义的检查约束是更标准的限制列值的方法,但检查约束不能直接作用于用户定义数据类型。 1用企业管理器创建规则在企业管理器中选择数据库对象“规则”,单击右键从快捷菜单中选择“新建规则”选项,即会弹出如图所示的“规则属性”对话框。输入规则名称和表达式之后,单击“确定”按钮,即完成规则的创建。2用 CREATE RULE 语句创建规则CREATE RULE 语句用于在当前数据库中创
4、建规则,其语法格式如下:CREATE RULE rule_name AS condition_expression例 8-1 创建雇佣日期规则 hire_date_rule。CREATE RULE hire_date_ruleAS hire_date=1980-01-01 and hire_date18)例 8-25 创建一个订货表 orders,保证各订单的订货量必须不小于 10。CREATE TABLE orders( order_id char(8),p_id char(8),p_name char(10) ,quantity smallintCONSTRAINT chk_quantit
5、y CHECK (quantity=10),CONSTRAINT pk_orders_id PRIMARY KEY (order_id) )例 8-26 创建 transporters 表并定义检查约束CREATE TABLE transporters( transporter_id char(4) NOT NULL,transport_name varchar(50),linkman_name char(8),address varchar(50),telephone char(12) NOT NULLCHECK(telephone LIKE 01-90-90-9-1-90-90-90-90
6、-90-90-9OR telephone LIKE 01-90-9-1-90-90-90-90-90-90-90-9)8.4.5 默认约束默认(Default)约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,以确保在没有为某列指定数据时,来指定列的值。默认值可以是常量,也可以是表达式,还可以为 NULL 值。定义默认约束的语法格式CONSTRAINT constraint_nameDEFAULT constant_expression FOR column_name例 8-27 在 Sales 数据库中,为员工表 employee 的 sex 列添加默认约束,默认值是“男”。ALTE
7、R TABLE employeeADD CONSTRAINT sex_default DEFAULT 男 FOR sex例 8-28 更改表 employee 为 hire_date 列定义默认约束。ALTER TABLE employeeADD CONSTRAINT hire_date_df DEFAULT (getdate() FOR hire_date例 8-29 添加具有默认值的可为空的列ALTER TABLE employeeADD hire_date datetimeDEFAULT (getdate() WITH VALUES例 8-30 使用默认约束。-创建表 purchase_
8、orderCREATE TABLE purchase_order( order_id2 char(6)NOT NULL,goods_id char(6) NOT NULL,employee_id char(4) NOT NULL,supplier_id char(5) NOT NULL,transporter_id char(4),order_num float NOT NULL,discount floatDEFAULT (0),order_date datetime NOT NULLDEFAULT (GetDate(),send_date datetime,arrival_date dat
9、etime)-使用 DEFAULT VALUES 选项为 purchase_order 表装载数据。INSERT INTO purchase_orderDEFAULT VALUES例 8-31 为表 purchase_orders 定义多个约束CREATE TABLE purchase_orders( order_id2 char(6) NOT NULL,goods_id char(6) NOT NULL,employee_id char(4) NOT NULL,supplier_id char(5) NOT NULL,transporter_id char(4),order_num float NOT NULL,discount floatCHECK (discount=0 AND discount order_date),CHECK (arrival_date send_date)