1、数据库原理及应用 Principles & Applications of DataBase,中原工学院软件学院,Software School,Zhongyuan University of Technology,2009-2,数据的完整性,第5+8章, 8.1 数据完整性类型 8.2 使用约束 8.3 使用规则 8.4 小结,8.1 数据完整性的类型,数据完整性 指的是数据库中存储的数据的一致性和准确性 数据完整性的类型:域完整性、实体完整性、引用完整性、自定义 域完整性 域(或列)完整性是指对列指定一组有效的值并决定是否可为空值 实体完整性 实体(或表)完整性要求表中的所有行都有一个惟一
2、的标识符,称为主键值 引用(参照)完整性 引用完整性确保主键(在被引用表中)和外键(在引用表中)之间的关系得到保持 用户自定义的完整性,8.1 数据完整性的类型,数据完整性的实现 使用约束 使用规则 使用默认值 使用标识列,8.2 创建和使用约束,约束的类型 PRIMARY KEY 约束 FOREIGN KEY 约束 CHECK 约束 UNIQUE 约束 DEFAULT 约束 级联引用完整性,8.2 创建和使用约束,8.2 创建和使用约束,1主键约束(PRIMARY KEY) 主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。每个表中只能有一个主关键字,且,也不
3、允许指定主关键字列有空属性。 应用 PRIMARY KEY 约束的注意事项 每张表只能有一个 PRIMARY KEY 约束 输入的值必须是惟一的 不允许空值 将在指定列上创建惟一索引 IMAGE 和TEXT 类型的列不能被指定为主关键字,8.2 创建和使用约束,主键约束(PRIMARY KEY)的创建企业管理器 数据表的设计视图中设置SQL语句语法:CONSTRAINT 约束名 PRIMARY KEY CLUSTERED | NONCLUSTERED (列,.n),8.2 创建和使用约束,2外键约束(FOREIGN KEY) 定义到同表或其他表中具有 PRIMARY KEY 或者 UNIQUE
4、 约束的列的引用 外关键字约束定义了表之间的关系(表关系图中默认关系名称:FK)。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它与哪个表中哪些列相关联。 具有 FOREIGN KEY 约束的列的取值范围只能是被引用的列的列值,8.2 创建和使用约束,2外键约束(FOREIGN KEY) 应用 FOREIGN KEY 约束的注意事项 提供了单列或多列的引用完整性 FOREIGN KEY 子句中指定的列的个数和数据类型必须和 REFERENCES 子句中指定的列的个数和数据类型匹配 并不自动创建索引,8.2 创建和使用约束,2外键约
5、束(FOREIGN KEY) 应用 FOREIGN KEY 约束的注意事项 修改数据的时候,用户必须在被 FOREIGN KEY 约束引用的表上具有 SELECT 或 REFERENCES 权限 若引用的是同表中的列,那么可只用 REFERENCES 子句而省略 FOREIGN KEY 子句,8.2 创建和使用约束,3惟一性约束(UNIQUE) UNIQUE 约束指明列中的任意两行不能有相同的值 指定一个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。惟一性约束指定的列可以有空属性。 由于主关键字值是具有惟一性的,因此主关键字列不能再设定惟一性约束。 惟一性约束最多由16 个列组成。,
6、UNIQUE 的各个列可以声明为允许 NULL 值,8.2 创建和使用约束,3惟一性约束(UNIQUE) 应用 UNIQUE 约束的注意事项 允许一个空值 在一个表上允许多个 UNIQUE 约束 可在一个或者多个列上定义 是通过一个惟一索引强制约束的,8.2 创建和使用约束,3惟一性约束(UNIQUE) 使用企业管理器创建UNIQUE 约束 在表的设计器窗口中: (1) 右击任一字段所在的行,然后选择“属性”命令,或“索引/键” (转步骤3)。 (2) 当出现“属性”对话框时,选择“索引/键”选项卡,然后单击“新建”按钮,为表创建新的约束。 (3) 在“列名”列表中选择要施加UNIQUE约束的
7、字段,然后选取“创建UNIQUE”复选框并单击“约束”选项按钮。,8.2 创建和使用约束,3惟一性约束(UNIQUE) 使用企业管理器创建UNIQUE 约束,8.2 创建和使用约束,3惟一性约束(UNIQUE) 在创建表时定义UNIQUE 约束,例建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码CREATE TABLE DEPT(Deptno NUMERIC(2),Dname CHAR(9) UNIQUE,/*要求Dname列值唯一*/Location CHAR(10),PRIMARY KEY (Deptno);,8.2 创建和使用约束,3惟一性约束(UNIQ
8、UE) PRIMARY KEY 和 UNIQUE 约束 声明 PRIMARY KEY 或 UNIQUE 约束的结果只是自动创建了一个指定列上的惟一索引,通过惟一索引来确保值的惟一性 可空性 PRIMARY KEY 的各个列必须声明为 NOT NULL,而 UNIQUE 的各个列可以声明为允许 NULL 值 在惟一索引中,认为所有的 NULL 值是相等的 索引的属性 PRIMARY KEY 约束所创建的惟一索引默认为 CLUSTERED(创建聚集索引 ) 选择键 保持键的长度尽可能短,必要时可另外创建一个代替键 不要使用 float 或 real 数据类型的列作为主键,8.2 创建和使用约束,4
9、 CHECK 约束 限制输入到指定列的值只能为某些特定值,即对输入列或整个表中的值设置检查条件 语法: CONSTRAINT 约束名 CHECK (逻辑表达式),8.2 创建和使用约束,4 CHECK 约束 使用企业管理器创建CHECK 约束 (1) 右击要添加CHECK 约束的表,然后单击“设计表”命令,以打开表设计器窗口。 (2) 右击表设计窗口,然后选择“CHECK约束”命令。 (3) 当出现“属性”对话框时,选择“CHECK约束”选项卡,然后单击“新建”按钮,为表创建新的约束,然后在“约束表达式”框中输入一个条件表达式。 如: Sage 150,8.2 创建和使用约束,4 CHECK
10、约束 在创建表时定义CHECK 约束 例 Student表的Ssex只允许取“男”或“女”。CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(8) NOT NULL, Ssex CHAR(2) CHECK (Ssex IN (男,女) ) , /*性别属性Ssex只允许取男或女 */Sage SMALLINT,Sdept CHAR(20);,8.2 创建和使用约束,4 CHECK 约束 两种强制域完整性的方法:CHECK 约束和规则 CHECK 约束定义了一个表达式,若数据修改语句使得表达式值为 FALSE 的话,将拒绝语句执行 规
11、则的功能和 CHECK 约束基本相同,除了语法不同,能力稍弱。规则是为了向下兼容而保留的 规则可定义一次,然后对多个列分别绑定; 而 CHECK 约束则需要对每个列定义。但 CHECK 约束的功能略强一些(例如引用同行中其他列的值和调用系统函数等),8.2 创建和使用约束,4 CHECK 约束 应用 CHECK 约束的注意事项-1 在每次执行 INSERT 或者 UPDATE 语句的时候校验数据值 可以引用同表中的其他列 不能应用于数据类型为 rowversion 的列 不能包含子查询 可通过执行 DBCC CHECKCONSTRAINTS 语句来返回违反了约束的列 列级 CHECK 约束可省
12、略名字,让系统自动生成,8.2 创建和使用约束,4 CHECK 约束 应用 CHECK 约束的注意事项-2 CHECK 约束可使用正则表达式 表达式可以用 AND 以及 OR 连接以表示复杂逻辑 表级 CHECK 约束可引用同行中的多列,但不能跨行或跨表 可用 CHECK 约束来防止输入 NULL 值,例如 CHECK (输入值 IS NOT NULL) NULL 值可能使表达式值为未知,这时数据修改语句仍可执行 CHECK 约束中可使用系统函数,8.2 创建和使用约束,5默认值约束(DEFAULT) 如果一个列的值在 INSERT 语句中没有指定,DEFAULT 约束将自动输入一个值,可以是
13、预先指定的常量、NULL 或者一个系统函数运行时的值。 默认约束通过定义列的默认值或使用数据库的默认值对象绑定表的列,来指定列的默认值。 SQL Server 推荐使用默认约束,而不使用定义默认值的方式来指定列的默认值。,8.2 创建和使用约束,创建并使用默认值约束 在创建表或修改表时输入默认值 不作为对象,只在所在列中使用 在企业管理器中创建默认值对象 创建后“确定”保存,作为整个数据库的对象 再次打开才能在“默认”的属性对话框中绑定到UDT或列上 (可多表的多列,一次定义,多次使用)(亦可在创建或修改表时选定) 利用SQL语句创建,8.2 创建和使用约束,创建并使用默认值约束 利用SQL语
14、句创建 CREATE DEFAULT default_name AS constant_expression constant_expression 只包含常量值的表达式(不能包含任何列或其它数据库对象的名称)。,8.2 创建和使用约束,创建并使用默认值约束 利用SQL语句创建例 USE pubs GO CREATE DEFAULT phonedflt AS unknown 绑定默认值 sp_bindefault phonedflt, authors.phone,8.2 创建和使用约束,应用 DEFAULT 约束的注意事项-1 DEFAULT 约束创建时将检查表中的现存数据 DEFAULT 约
15、束只对 INSERT 语句有效 每列只能定义一个 DEFAULT 约束 不能和“标识”属性及 rowversion (timestamp)数据类型共同使用 允许使用一些系统提供的值:USER、CURRENT_USER、SESSION_USER、SYSTEM_USER 及 CURRENT_TIMESTAMP 有可能会和 CHECK 约束冲突,8.2 创建和使用约束,应用 DEFAULT 约束的注意事项-2 为具有 PRIMARY KEY 或 UNIQUE 约束的列指定默认值是没有意义的 常量值外面可以加或者不加括号,字符或者日期常量必须加上单引号或双引号 在一个 INSERT 语句中对一个列,8
16、.2 创建和使用约束,6禁用约束 禁用现有数据上的约束检查 在加载新数据时禁用约束检查,8.2 创建和使用约束,当在表上添加约束的时候,我们可以禁用对已有数据的约束检查 对已有数据禁用约束检查的注意事项 只能禁用 CHECK 和 FOREIGN KEY 约束 当为一个已有数据的表添加 CHECK 或 FOREIGN KEY 约束的时候,使用 WITH NOCHECK 选项来禁用对已有数据的约束检查 当现有数据不再变化的时候,使用 WITH NOCHECK 选项。若数据被更新,则它的新值必须符合 CHECK 约束 确定禁用约束检查是恰当的。在决定添加约束前,可修改现有数据,8.2 创建和使用约束
17、,为了避免约束检查的开销,有时候可能希望禁用约束 已经确保数据符合约束 数据并不符合约束,但稍后可以更改其值并重用约束 语法:ALTER TABLE 表名 CHECK | NOCHECK CONSTRAINT ALL|约束名,.n 查看约束是启用还是禁用的状态 系统存储过程 sp_help 系统函数 OBJECTPROPERTY 的 CnstIsDisabled 属性,8.3 创建和使用规则,默认值和规则是可以绑定到一个或多个列或用户定义数据类型的对象,使得可以一次定义,多次使用。但它们不是 ANSI 兼容的。 默认值:若插入数据的时候没有指定某列的值,则此列绑定的默认值将提供一个默认值。 规
18、则:规则指定了能插入列的可接受的值。它确保数据在指定值域内,匹配某个模式,或者匹配指定列表中的项。,8.3 创建和使用规则,规则:规则指定了能插入列的可接受的值。它确保数据在指定值域内,匹配某个模式,或者匹配指定列表中的项。 规则的功能和 CHECK 约束基本相同,除了语法不同,能力稍弱。规则是为了向下兼容而保留的 规则可定义一次,然后对多个列分别绑定;而 CHECK 约束则需要对每个列定义。但 CHECK 约束的功能略强一些(例如引用同行中其他列的值和调用系统函数等),8.3 创建和使用规则,规则是单独存储的独立的数据库对象 规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义
19、对象的删除、修改不会对与之相连的规则产生影响。 规则和约束可以同时使用,表的列可以有一个规则及多个约束。,8.3 创建和使用规则,规则与约束很相似,相比之下,使用在修改表或创建表命令中的约束是更标准的限制列值的方法,但约束不能直接作用于用户自定义数据类型。,8.3 创建和使用规则,1.用企业管理器创建规则 (1)右击“规则”选项,然后单击“新建规则”命令,打开创建规则对话框如图所示。 (2)输入规则名称。例如:性别规则。 (3) 在文本框中输入表达式。例如:sex in(男,女) (4) 单击“确定”按钮即完成规则的创建。,8.3 创建和使用规则,2.查看规则 双击某规则,显示“属性”对话框
20、或 右击“规则”选项,然后单击“从这里创建窗口”命令,即可从右边的任务板中看到规则的大部分信息,包括规则的名称、所有者、创建时间等。,8.3 创建和使用规则,3.规则的绑定与松绑 创建规则后,规则仅仅只是一个存在于数据库中的对象,并未发生作用。需要将规则绑定与数据库表或用户自定义对象联系起来,才能达到创建规则的目的。联系的方法称为“绑定”。 一个规则可以绑定多个对象,这正是规则的魅力所在。 解除规则与对象的绑定称为“松绑”。,8.3 创建和使用规则,用企业管理器管理绑定规则 (1)双击要绑定的规则,或从快捷菜单中选择“属性”选项,打开规则属性对话框。 “绑定”按钮用于用户自定义数据类型,“列绑
21、定”按钮用于绑定表的列。 (2) 单击“绑定”按钮则出现绑定规则到用户自定义数据类型的对话框;单击“列绑定”按钮则出现绑定规则到表的列的对话框。,8.3 创建和使用规则,松绑规则 4.查看规则绑定 右击规则“所有任务” “显示相关性” 5.删除规则,8.3 创建和使用规则,6.关于规则的注意事项 规则定义可以包含任何在 WHERE 子句中有效的表达式 一个列或者用户定义数据类型只能被一个规则绑定 规则对已经输入表中的数据不起作用 规则所指定的数据类型必须与所绑定的对象的数据类型一致 规则不能绑定一个数据类型为TEXT MAGE 或TIMESTAMP 的列。 与表的列绑定的规则优先于与用户自定义数据类型绑定的列,因此,如果表的列的数据类型与规则A绑定,同时列又与规则B绑定,则以规则B为列的规则。 可以直接用一个新的规则来绑定列或用户自定义数据类型,而不需要先将其原来绑定的的规则解除,系统会将旧规则覆盖,8.4 小 结,本章介绍数据完整性及其实现等。 重点: 数据完整性的类型 数据完整性的实现,