默认值是在用户没有明确指定某列值的情况下,系统自动填.doc

上传人:da****u 文档编号:1055763 上传时间:2018-11-26 格式:DOC 页数:23 大小:7.73MB
下载 相关 举报
默认值是在用户没有明确指定某列值的情况下,系统自动填.doc_第1页
第1页 / 共23页
默认值是在用户没有明确指定某列值的情况下,系统自动填.doc_第2页
第2页 / 共23页
默认值是在用户没有明确指定某列值的情况下,系统自动填.doc_第3页
第3页 / 共23页
默认值是在用户没有明确指定某列值的情况下,系统自动填.doc_第4页
第4页 / 共23页
默认值是在用户没有明确指定某列值的情况下,系统自动填.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、本章主要介绍默认值、约束、索引和表别名。默认值是在用户没有明确指定某列值的情况下,系统自动填充预先定义或指定的值;约束是为了使信息符合特定的限制或规则;索引是为了提高数据的查阅速度;别名是为了方便对表或视图的操作。通过阅读本章,您可以: 掌握默认值和约束的用法 掌握索引的创建、修改和删除 掌握别名的创建、修改和删除1011第第 章章导读约束、索引和别名( 视频讲解:46 分钟)DB2 从入门到精通19810.1 默认值和约束数据通常必须符合特定限制或规则,这些限制可能适用于单条信息(例如,格式和序号) ,也可能适用于若干条信息,下面是一些常用的限制规则。1列数据值的可空性空值表示未知状态。默认

2、情况下,所有内置数据类型都支持空值的存在。但是,一些业务规定可能要求必须始终为某些列提供值,例如,员工编号。对于这种情况,可以使用 NOT NULL 约束来确保始终不会为给定表列指定空值。为特定列定义 NOT NULL 约束后,尝试在该列中放入空值的任何插入或更新操作都将失败。2默认列数据值正如一些业务规则要求必须始终提供值一样,其他业务规则可能要求该值应该是什么,例如,“学生表”中的“性别”必须是“男”或“女” 。列默认值约束用于确保在表中添加给定表列没有特定值的行时,始终为该列指定预定义的值。为列提供的默认值可以是空值、与该列的数据类型兼容的约束值或数据库管理器提供的值。3键键是表或索引中

3、可用来标识或访问特定数据行的单列或一组列。任何列都可以是键的一部分,并且同一列可以是多个键的一部分。 由单列组成的键称为“原子键” ;由多列组成的键称为“组合键” 。 除了具有原子或组合属性外,还根据使用键实施约束的方式对键进行了分类:(1) “唯一键”用来实施唯一约束。(2) “主键”用来实施实体完整性约束(主键是一种特殊的唯一键,它不支持空值) 。(3) “外键”用来实施引用完整性约束(外键必须引用主键或唯一键,外键没有相应的索引) 。通常在声明表、索引或引用约束定义期间指定键。4完整性约束约束是对可在表中插入、删除或更新的值进行限制的规则。约束包括非空约束、检查约束、唯一约束(也称为唯一

4、键约束) 、主键约束、外键约束(也称为引用约束、引用完整性约束或参照约束) 。10.1.1 默认值在表中新增记录时,如果用户没有明确指定某些列的值,在这种情况下,由系统自动填充的为某些列和数据类型预先定义或指定的值,称为“默认值” 。第 10 章 约束、索引和别名199各种数据类型的默认值如下。(1)NULL:Char、VarChar 等字符串类型。(2)0:用于小整数、整数、十进制、单精度浮点数和双精度浮点数。(3)空白:用于固定长度字符串和固定长度双字节字符串。(4)零长度字符串:用于变长字符串、二进制大对象、字符大对象和双字节字符大对象。(5)日期:这是插入行时的系统日期(从 CURRE

5、NT_DATE 专用寄存器获取) 。将日期列添加至现有表时,将为现有行指定日期 2001 年 01 月 01 日。(6)时间或时间戳记:这是插入语句时的系统时间或系统日期/时间(从 CURRENT_TIME 专用寄存器获取) 。将时间列添加至现有表时,将为现有行指定时间 00:00:00 或包含日期 0001 年 01 月 01日和时间 00:00:00 的时间戳记。(7)用户定义的单值数据类型:这是系统为用户定义的单值数据类型的基本数据类型定义的默认值(强制类型转换为用户定义的单值数据类型) 。10.1.2 约束约束只与表关联,它们是在创建表的过程中定义的(使用 CREATE TABLE 语

6、句) ,或者是在创建表后添加至表定义的(使用 ALTER TABLE 语句) 。可以使用 ALTER TABLE 语句来修改约束。在大多数情况下,随时都可以删除现有约束;此操作不会影响表结构和存储在表中的数据。1创建和修改约束可以使用 ALTER TABLE 语句将约束添加至现有表。约束名不能与在 ALTER TABLE 语句内指定的任何其他的约束相同,且必须在该表内是唯一的(这包括定义的任何引用完整性约束的名称) 。在成功执行该语句之前,会对照新条件检查现有数据。要修改此约束,必须先删除此约束,然后重新创建。在某个列上定义约束可以有 4 种方式: 界面上创建表时添加约束。 SQL 命令创建表

7、时添加约束。 创建表后在界面中添加约束。 创建后用 SQL 语句添加约束。创建和修改唯一约束的方法和步骤如下:可以将唯一约束添加至现有表。约束名不能与在 ALTER TABLE 语句内指定的任何其他约束相同,且必须在该表内是唯一的(这包括定义的任何引用完整性约束的名称) 。在成功执行该语句之前,会对照新条件检查现有数据。所有行将获得给定语句的相同默认时间/时间戳记值。DB2 从入门到精通200使用 ALTER TABLE 语句的 ADD CONSTRAINT 选项来定义唯一约束。【例 10.1】 在“学号”上创建一个唯一约束(实例位置:光盘TMsl101)。ALTER TABLE mr.学生表

8、DROP PRIMARY KEY-首先要删除“学号”上已有的主键,才能重新创建 “学号”上的唯一约束ADD CONSTRAINT xsb_unique_key_name UNIQUE(学号)-在“学号”上添加唯一约束,约束名为 xsb_unique_key_name本例运行结果如图 10.1 所示。图 10.1 添加“唯一约束”创建和修改主键约束的方法和步骤如下:可以将主键约束添加至当前表中。约束名必须在表内是唯一的(这包括定义的任何引用完整性约束的名称) 。在成功执行该语句之前,会对照新条件检查现有数据。创建主键约束的语句语法为:ALTER TABLE table_nameADD CONST

9、RAINT primary_key_namePRIMSRY KEY column_name ,n;不能修改现有主键约束。要将另一列或另一组列定义为主键,必须先删除现有主键定义,然后再重新创建。创建和修改检查约束的方法和步骤如下:当添加表检查约束时,插入或更新该表的程序包和高速缓存的动态 SQL 可能被标记为无效。创建检查约束的语句语法为:ALTER TABLE table_nameADD CONSTRAINT check_name CHECK (logical_expression)NO ENFORCED | ENFORCEDENABLE QUERY OPRIMIZATION;【例 10.2】

10、 假如“学生表”的“性别”列上还没有约束,在“学生表”的“性别”列上添加约“学生表”中“学号 ”列已经有主键约束了,不能再创建唯一约束,否则系统会提示错误。但可以先将“学生表”中定义在“ 学号”上的主键删除,并在“ 学号”上重新 创建一个唯一约束,它表示唯一标识该表中的学号的一个新方法。第 10 章 约束、索引和别名201束, “性别”只能为“男”或“女” (本实例的约束已经添加,不能再添加相同约束,读者可以将约束删除,然后重新用 SQL 语句添加) (实例位置:光盘TMsl102)。ALTER TABLE mr.学生表ADD CONSTRAINT xsb_check CHECK (性别 =

11、男 OR 性别 =女)-性别只能是“男”或“女”ENFORCED -强制此约束ENABLE QUERY OPTIMIZATION; -在查询优化期间考虑此约束本例运行结果如图 10.2 所示。图 10.2 检查约束【例 10.3】 在课程表上的“开课学期”上添加约束 “开课学期”必须是 18(这个约束实际上已经添加过了,不能再次添加相同的约束,想要添加一定要删除以前添加过的约束) (实例位置:光盘TMsl103)。ALTER TABLE mr.课程表ADD CONSTRAINT kcb_check CHECK (开课学期0 AND 开课学期9)-开课学期只能为 18ENFORCED -强制此约

12、束ENABLE QUERY OPTIMIZATION;-在查询优化期间考虑此约束本例运行结果如图 10.3 所示。图 10.3 检查约束创建和修改外键约束的方法和步骤如下:外键约束(也称为引用约束或引用完整性约束)能够定义表间以及表内必须的关系。外键是表中的一列或一组列,要求其值与其父表或昵称中某行的至少一个主键值相匹配。创建外键(引用)约束的语句语法为:ALTER TABLE table_nameDB2 从入门到精通202ADD CONSTRAINT foreign_key_constraint_nameFOREIGN KEY (column_name ,n)REFERENCESparent

13、_table_name (column_name ,n)ON DELETE delete_action_typeON UPDATE update_action_typeENFORCED | NOT ENFORCEDENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION;其中:delete_action_type :=NO ACTION | RESTRICT | CASCADE | SET NULLupdate_action_type :=NO ACTION | RESTRICT一个表可以同时创建多个外键约束。要修改此约束,必须先删除此约束,

14、然后再重新创建。数据库管理器通过强制执行与每个引用约束关联的一组规则来处理这类情况。这组规则包括:插入规则、更新规则、删除规则,下面分别进行介绍。(1)插入规则。引用约束的插入规则为:外键的非空插入值必须与父表的父键的某些值相匹配。如果组合外键的值的任何组成部分为空,那么该值为空。指定外键时,此规则是隐式的。(2)更新规则。引用约束的更新规则是在定义引用约束时指定的。选项有 NO ACTION 和RESTRICT。在更新父表的某行或从属表的某行时应用更新规则。如果是父行,更新父键的某列中的值时,下列规则适用: 如果从属表中的任何行与该键的原始值相匹配,在更新规则为 RESTRICT 的情况下,

15、会拒绝更新。 如果在更新语句完成时,从属表中的任意行没有相应的父键(排除 AFTER 触发器) ,当更新规则为 NO ACTION 时,会拒绝更新。如果是从属行,当指定外键时,NO ACTION 更新规则是隐式的。NO ACTION 意味着更新语句完成时,外键的非空更新值必须与父表的父键的某些值相匹配。如果组合外键的值的任何组成部分为空,那么该值为空。(3)删 除 规 则 。 引 用 约 束 的 删 除 规 则 是 在 定 义 引 用 约 束 时 指 定 的 。 选 项 有 NO ACTION、 RESTRICT、 CASCADE 或 SET NULL。只有当外键的某些列允许空值时,才能指定

16、SET NULL。在删除父表的某行时应用引用约束的删除规则。更确切地说,当父表的某行是删除或传播删除操作的对象,且该行在引用约束的从属表中具有从属项时,该规则适用。考虑这样一个例子,其中 P 是父表,D 是从属表,而 P 是充当删除或传播删除操作的对象的父行。删除规则的工作方式如下: 对于 RESTRICT 或 NO ACTION,发生错误时不会删除任何行。 对于 CASCADE,删除操作会传播至表 D 中的 P 的从属项。 对于 SET NULL,表 D 中的 P 的每个从属项的外键的每个可空列被设置为空。【例 10.4】 在 “成 绩 表 ”上 添 加 两 个 关 键 字 cjb_fore

17、ign_key1 和 cjb_foreign_key2(实例位置:光盘TMsl104)。第 10 章 约束、索引和别名203ALTER TABLE mr.成绩表ADD CONSTRAINT cjb_foreign_key1FOREIGN KEY (学号) REFERENCES mr.学生表(学号)ON DELETE CASCADEON UPDATE RESTRICTENFORCEDENABLE QUERY OPTIMIZATIONADD CONSTRAINT cjb_foreign_key2FOREIGN KEY(课程号) REFERENCES mr.课程表(课程号)ON DELETE RES

18、TRICTON UPDATE NO ACTIONENFORCEDENABLE QUERY OPTIMIZATION;本例运行结果如图 10.4 所示。图 10.4 添加外键(1)外键关键字 cjb_foreign_key1 将学生表看成“ 父表”,将成绩表看成“从属表”;插入规则是隐式的,如果要向“ 成绩表”中插入一条记录,那么 这条成绩记录中的“学号”的值必须是“学生表”中已经存在的某个“学号” ;删除规则为 CASCADE,当删除父表“学生表”中的一条学生记录时,系统自动删除从属表“成绩表” 中相同学号的学生成绩记录;更新规则为 RESTRICT,如果在 尝试更新“ 学生表”中的父键“学号

19、” 时,父行(即“学生表”中准备更新的行)有任何从属行(即“成绩表”中依赖于“ 学生表”中即将更新的那些“学号” 的行),那么不能更新父行中父键的值。(2)外键关键字 cjb_foreign_key2 将课程表看成“ 父表”,将成绩表看成“从属表”;插入规则是隐式的,如果要向“ 成绩表”中插入一条记录,那么 这条成绩记录中的“课程号”的值必须是“课程表”中已经存在的某个“课程号” ;删除规则为 RESTRICT,如果父行在删除时有任何从属行,那么不能删除父表的行。更新规则为 NO ACTION,如果父行在语句完成时有任何从属行,那么不能更新父行中父键的值。DB2 从入门到精通2043删除约束可

20、以使用含有 DROP 或 DROP CONSTRAINT 子句的 ALTER TABLE 语句显式删除表约束,或作为 DROP TABLE 语句的结果将其隐式删除。删除唯一约束的方法如下。使用 ALTER TABLE 语句的 DROP UNIQUE 子句,删除现有唯一约束以及依赖于此唯一约束的所有引用约束的定义。删除此唯一约束使引用该约束的任何程序包或高速缓存的动态语句无效。运行下面命令来删除表的唯一约束 unique_constraint_name:ALTER TABLE table_nameDROP UNIQUE unique_constraint_name;删除主键约束的方法如下。使用

21、ALTER TABLE 语句的 DROP PRIMARY KEY 子句删除主键以及依赖于此主键的所有引用约束的定义。运行下面的命令来删除现有表的主键:ALTER TABLE table_nameDROP PRIMARY KEY;如果表中没有主键,可以向表中插入相同的行。删除检查约束的方法和步骤如下:删除检查约束时,与该表有 INSERT 或 UPDATE 关系的所有程序包和高速缓存的动态语句将变得无效。可以在 SYSCAT.CHECKS 目录视图中查找所有检查约束的信息。【例 10.5】 查询 MRKJ 数据库中目前所有的检查约束(实例位置:光盘TMsl105)。实现步骤如下。(1)连接到 M

22、RKJ 数据库:CONNECT TO mrkj USER mr USING 1;(2)查询 MRKJ 数据库中目前所有的检查约束:SELECT * FROM SYSCAT.CHECKS;运行结果如图 10.5 所示。图 10.5 查看所有“检查约束”删除检查约束的语句的语法为:ALTER TABLE table_name DROP CONSTRAINT check_constraint_name;第 10 章 约束、索引和别名205删除外键(引用)约束的方法如下。使用 ALTER TABLE 语句的 DROP FOREIGN KEY 子句删除现有外键约束。运行以下命令来删除现有外键约束 for

23、eign_key_name:ALTER TABLE table_nameDROP FOREIGN KEY foreign_key_name;当删除外键约束时,包含下列语句的程序包或高速缓存的动态语句可能被标记为无效: 插入或更新包含外键表的语句。 更新或删除父表的语句。10.2 索 引我们都查过字典,当查阅字典时,为了提高查阅速度,并不是从字典的第一页开始顺序查找,而是首先查看字典的目录索引,找到需要的这个字在目录中所列的页码,然后根据这一页码直接找到该字所在的页。在数据库中,为了从大量的数据中迅速找到需要的内容,也采用了类似于字典目录这样的索引技术,使得数据查询时不必扫描整个数据库,就能迅速

24、获取到所需要的内容。下面介绍 DB2的索引技术。10.2.1 索引的概念使用数据行中的列值来标识整个行,可能需要一列或多列来标识该行,这种列被称为键。一个列可以在多个键中使用。索引是一个或多个键的集合,每个键指向表中的一行。SQL 优化器自动选择最有效率的访问表中数据的方法。当确定最快速的数据访问路径时,优化器会将索引考虑在内。在数据库系统中建立索引主要有以下作用:(1)快速存取数据。(2)保证数据记录的唯一性。(3)实现表与表之间的参照完整性。(4)在 使 用 ORDER BY、 GROUP BY 子 句 进 行 数 据 检 索 时 , 利 用 索 引 可 以 减 少 排 序 和 分 组 的

25、 时 间 。将数据添加到表时,除非已对该表和正在添加的数据执行了其他操作,否则简单地将数据追加至该表的底部。数据是无序的,搜索特定数据行时,必须检查从第一行到最后一行的每个表行。将索引用作按顺序访问表中数据的一种方法,该顺序在其他情况下可能不可用。索引按键中的值进行排序。键可以是唯一的,也可以是非唯一的。每个表应该至少有一个唯一键;但还可以有其他唯一键。每个索引正好有一个键,例如,可以使用员工编号(唯一)作为一个索引键,并使用部门号(非唯一)作为另一个索引键。索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。设计索引的原则如下:DB2 从入门到精通206(1)在创建索引

26、时要记住,虽然它们可以提高读取性能,但会对写性能产生负面影响。这是因为对于数据库管理器写入表中的每行,它还必须更新任何受影响的索引。因此,只有在会明显提高整体性能时,才应创建索引。(2)在创建索引时,还必须考虑表结构和经常对这些表执行的查询的类型。例如,经常发出查询的 WHERE 子句中出现的列是索引的优秀候选者,但是,在较少运行的查询中,索引对 INSERT和 UPDATE 语句的性能产生的负面影响可能超过其所带来的好处。(3)同样,在经常运行的查询的 GROUP BY 子句中出现的列可能会从创建索引中获益,尤其在用于分组行的值的数目小于要分组的行数时。10.2.2 索引的分类可以按照两种分

27、类角度给索引分类:按照唯一性分类,可分为唯一索引、非唯一索引;按照索引的键顺序与数据的物理存储顺序是否一致,可分为集群索引和非集群索引。1唯一索引和非唯一索引唯一索引是这样的一种索引,它通过确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性。尝试为已经包含数据的表创建唯一索引时,将检查组成该索引的列中的值是否唯一;如果该表包含具有重复键值的行,那么索引创建过程将失败。为表定义唯一索引后,将在插入和更新操作期间强制唯一性。除了强制数据值的唯一性外,唯一索引还可以用来提高查询处理期间检索数据的性能。另外,非唯一索引不用于对与它们关联的表强制执行约束。相反,非唯一索引通过维护频繁使用的数据

28、值的排序顺序,仅仅用于提高查询性能。2集群索引和非集群索引索引体系结构分为集群或非集群。集群索引是根据数据在磁盘上排序所依据的那个键构建的索引。在某些关系数据库管理系统中,集群索引的叶子节点对应于实际数据,而不是对应于指向位于其他地方的数据的指针,非集群索引的叶子节点就对应于这种指针。由于集群索引的叶子级别对应于实际数据这个事实,表中的数据将根据索引进行排序,因此,给定表中只能存在一个集群索引,但可以存在许多非集群索引。非集群索引是在任何键的基础上构建的索引。每种关系都可以有一个集群索引和许多个非集群索引。集群索引通常将实际记录存储在数据结构中,因此其速度比非集群索引要快很多。非集群索引被强制仅将记录标识存储在数据结构中,并且需要至少一个其他 I/O 操作才能检索到实际记录。重组与所选索引相关的表将对数据重新建立集群。建立了集群的索引对于带有范围谓词的列非常有用,因为它允许对表中的数据作更有效的顺序访问。由于相似的值在同一数据页上,从而减少了页访问次数。通常,表中只有一个索引可以具有较高的集群度。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 公文范文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。