新書推薦:
《
一个经济杀手的自白 第3版
》
售價:NT$
505.0
《
8秒按压告别疼痛
》
售價:NT$
398.0
《
津巴多时间心理学:挣脱束缚、改写命运的6种时间观
》
售價:NT$
352.0
《
大英博物馆东南亚简史
》
售價:NT$
806.0
《
纯粹·我只要少许
》
售價:NT$
367.0
《
投机苦旅:一位投机客的凤凰涅槃
》
售價:NT$
403.0
《
重返马赛渔场:社会规范与私人治理的局限
》
售價:NT$
316.0
《
日子慢慢向前,事事慢慢如愿
》
售價:NT$
254.0
編輯推薦:
软件开发视频大讲堂丛书系清华社视频大讲堂重点大系之一。该大系包括多个子系列,每个子系列的图书在其同品种的图书中销售名列前茅,其中:4个品种荣获全行业优秀畅销品种1个品种荣获2012年清华大学出版社专业畅销书一等奖绝大多数品种在全国计算机零售图书排行榜同品种排行中名列前茅截至目前该大系累计销售超过130万册该大系已成为近年来清华社计算机专业基础类零售图书畅销品牌之一
软件开发视频大讲堂系列作为清华社视频大讲堂大系的子系列之一,继承和创新了清华社视频大讲堂大系的编写模式、写作风格和优良品质。本书突出了以下内容:总长总时长17小时同步视频演示讲解,可反复观摩,让学习更为快捷、高效261个典型实例,通过实例学习更深入,更有趣,更有动力369道面试真题,了解工作实例及面试问题,更好适应企业需求596项能力测试题目,检测是否过关,了解学习之不足。
软件开发视频大讲堂系列作为清华社视频大讲堂大系的子系列之一,执着于专业,精细于品质。集基础知识、核心技能、高级应用、项目案例于一体好学、好用、高效
內容簡介:
《DB2从入门到精通》一书从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用DB2进行数据管理的各种技术。《DB2从入门到精通》共分3篇19章,包括初识DB2,DB2的体系结构与DB2工具,实例和服务器管理,DB2数据库基础,管理表空间和表,表数据的基本操作,数据库对象,DB2数据查询技术,视图的使用,约束、索引和别名,SQL过程语言,DB2中的函数,存储过程和触发器,DB2数据库安全处理,数据库的备份与恢复,PureXML技术应用,XQuery技术的使用,数据移动,事务与锁等内容。 《DB2从入门到精通》所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会DB2管理数据库的精髓,快速提高数据库管理技能。
關於作者:
明日科技,是一家专业从事软件开发、教育培训以及软件开发教育资源整合的高科技公司,其编写的教材既注重选取软件开发中的必需、常用内容,又注重内容的易学、方便以及相关知识的拓展,深受读者喜爱。其编写的图书主要有软件开发视频大讲堂软件开发实战1200例软件工程师开发大系等系列。多次荣获全行业优秀畅销品种中国大学出版社优秀畅销书等奖项,多个品种长期位居同类图书销售排行榜的前列。
目錄 :
第1篇 基 础 知 识
第1章 初识DB2
视频讲解:31分钟
1.1 DB2的发展历史
1.2 关系型数据库的基本理论
1.2.1 数据模型的概念
1.2.2 常见的数据模型
1.2.3 关系型数据库与数据库管理系统
1.2.4 关系型数据库的E-R模型
1.2.5 关系型数据库的设计范式
1.2.6 关系数据库的设计原则
1.3 其他常见关系数据库
1.3.1 Access数据库
1.3.2 SQL Server数据库
1.3.3 Oracle数据库
1.4 DB2的安装与配置
1.4.1 DB2的安装
1.4.2 验证DB2的安装
1.5 小结
1.6 实践与练习
第2章 DB2的体系结构与DB2工具
视频讲解:66分钟
2.1 DB2体系结构
2.2 对象层次关系
2.3 数据访问过程
2.4 DB2命令工具的使用
2.4.1 命令编辑器
2.4.2 命令窗口
2.4.3 命令行处理器
2.4.4 命令编辑器命令窗口命令行处理器用法的区别
2.5 DB2常用工具
2.5.1 配置助手
2.5.2 控制中心
2.5.3 工具设置
2.5.4 向导
2.5.5 信息中心
2.5.6 运行状况中心
2.5.7 任务中心
2.5.8 复制中心
2.5.9 日志
2.6 小结
2.7 实践与练习
第3章 实例和服务器管理
视频讲解:26分钟
3.1 实例
3.1.1 什么是DB2实例
3.1.2 创建实例
3.1.3 实例目录
3.1.4 列出实例
3.1.5 启动停止实例
3.1.6 更新实例
3.1.7 删除实例
3.1.8 配置实例
3.2 管理服务器
3.2.1 管理服务器的概念
3.2.2 创建管理服务器
3.2.3 管理服务器的相关命令
3.2.4 删除管理服务器
3.2.5 配置管理服务器
3.3 小结
3.4 实践与练习
第4章 DB2数据库基础
视频讲解:30分钟
4.1 数据库结构
4.2 数据库基本概念
4.3 数据库的创建、编目和删除
4.3.1 创建数据库
4.3.2 SQL语句中的注释符
4.3.3 编目数据库
4.3.4 删除数据库
4.4 小结
4.5 实践与练习
第5章 管理表空间和表
视频讲解:53分钟
5.1 表空间的创建、修改和删除
5.1.1 创建表空间
5.1.2 修改表空间
5.1.3 删除表空间
5.2 表的创建、修改和删除
5.2.1 DB2数据类型
5.2.2 创建表
5.2.3 修改表
5.2.4 删除表
5.3 小结
5.4 实践与练习
第6章 表数据的基本操作
视频讲解:30分钟
6.1 SQL语言的概述
6.1.1 SQL语言的特点
6.1.2 SQL语言的分类
6.1.3 SQL语言的编写规则
6.2 使用界面操作表数据
6.3 插入记录
6.3.1 用界面方式插入记录
6.3.2 用命令方式插入记录
6.4 修改记录
6.4.1 用界面方式修改记录
6.4.2 用命令方式修改记录
6.5 删除记录
6.5.1 用界面方式删除记录
6.5.2 用命令方式删除记录
6.6 小结
6.7 实践与练习
第7章 数据库对象
视频讲解:47分钟
7.1 数据库对象概述
7.2 模式
7.2.1 使用控制中心的方式创建模式
7.2.2 使用命令的方式创建模式
7.3 表
7.3.1 表的维护
7.3.2 表约束
7.3.3 表状态
7.3.4 表压缩
7.3.5 表分区
7.4 索引
7.4.1 B 树结构
7.4.2 索引的好处
7.4.3 合适的索引
7.4.4 复合索引
7.5 其他常用数据库对象
7.5.1 视图
7.5.2 昵称
7.5.3 序列
7.5.4 自增字段
7.6 小结
7.7 实践与练习
第2篇 核 心 技 术
第8章 DB2数据查询技术
视频讲解:78分钟
8.1 选择、投影、连接和集合运算
8.1.1 选择
8.1.2 投影
8.1.3 连接
8.1.4 集合运算
8.2 检索数据
8.2.1 简单查询
8.2.2 筛选查询
8.2.3 分组查询
8.2.4 排序查询
8.2.5 多表关联查询
8.2.6 使用聚集函数计算列值
8.3 子查询的用法
8.3.1 子查询
8.3.2 单行子查询
8.3.3 多行子查询
8.3.4 关联子查询
8.4 小结
8.5 实践与练习
第9章 视图的使用
视频讲解:37分钟
9.1 视图概述
9.1.1 视图与表的关系
9.1.2 视图的优点
9.1.3 使用视图的注意事项
9.2 创建视图
9.2.1 使用界面方式创建视图
9.2.2 使用命令方式创建视图
9.2.3 创建特殊类型视图
9.3 查询视图
9.4 更新视图
9.4.1 使用界面方式操作视图数据
9.4.2 使用命令方式操作视图数据
9.5 修改视图的注释
9.5.1 使用界面方式为视图CJB_VIEW1添加注释
9.5.2 使用命令方式为视图添加注释
9.6 删除视图
9.6.1 使用界面方式删除视图
9.6.2 使用命令方式删除视图
9.7 视图的维护
9.8 小结
9.9 实践与练习
第10章 约束、索引和别名
视频讲解:46分钟
10.1 默认值和约束
10.1.1 默认值
10.1.2 约束
10.2 索引
10.2.1 索引的概念
10.2.2 索引的分类
10.2.3 创建索引
10.2.4 查看已创建的索引
10.2.5 修改索引
10.2.6 重命名索引
10.2.7 删除索引
10.3 别名
10.3.1 创建别名
10.3.2 使用别名
10.3.3 删除别名
10.4 小结
10.5 实践与练习
第11章 SQL过程语言
视频讲解:120分钟
11.1 SQL PL语言
11.1.1 SQL PL语言元素
11.1.2 VALUES语句
11.2 数据类型
11.2.1 系统数据类型
11.2.2 创建单值数据类型
11.2.3 创建结构数据类型
11.2.4 创建数组数据类型
11.3 声明变量
11.4 赋值
11.4.1 赋值语句的语法
11.4.2 专用寄存器
11.5 游标
11.5.1 游标的概念
11.5.2 声明游标
11.5.3 打开游标
11.5.4 读取游标
11.5.5 关闭游标
11.5.6 游标和结果集
11.6 流程控制语句
11.6.1 条件语句
11.6.2 迭代语句与退出循环语句
11.6.3 RETURN语句
11.7 异常处理机制
11.7.1 声明有名称的条件
11.7.2 声明条件处理程序
11.7.3 强制发出异常
11.8 MERGE语句
11.9 小结
11.10 实践与练习
第12章 DB2中的函数
视频讲解:38分钟
12.1 系统内置函数
12.1.1 系统内置函数介绍
12.1.2 常用系统内置函数
12.2 用户定义函数
12.2.1 创建和调用用户定义函数
12.2.2 用户定义函数的删除
12.3 小结
12.4 实践与练习
第13章 存储过程和触发器
视频讲解:71分钟
13.1 存储过程
13.1.1 存储过程的概念
13.1.2 存储过程的类型
13.1.3 SQL存储过程的创建与执行
13.1.4 存储过程的重载
13.1.5 存储过程的查询、修改和删除
13.2 触发器
13.2.1 触发器的概念
13.2.2 触发器的类型
13.2.3 用CREATE TRIGGER语句创建触发器
13.2.4 查询、修改和删除触发器
13.3 小结
13.4 实践与练习
第3篇 高 级 应 用
第14章 DB2数据库安全处理
视频讲解:72分钟
14.1 DB2数据库安全概述
14.2 认证机制
14.3 身份验证和授权
14.4 DB2身份验证
14.4.1 DB2身份验证方式
14.4.2 其他身份验证参数
14.4.3 在客户机-服务器环境中设置身份验证
14.5 管理权限
14.5.1 管理权限级别
14.5.2 授予或撤销实例级权限
14.5.3 授予或撤销数据库级权限
14.6 特权
14.6.1 特权级别
14.6.2 授予和撤销特权
14.6.3 隐式特权
14.7 LBAC凭证
14.8 GET AUTHORIZATIONS命令
14.9 使用模式控制对数据库对象的访问
14.10 小结
14.11 实践与练习
第15章 数据库的备份与恢复
视频讲解:53分钟
15.1 备份与恢复
15.2 恢复操作的种类
15.3 事务日志记录
15.3.1 为什么需要日志
15.3.2 事务日志记录的概念
15.3.3 主日志文件和辅助日志文件
15.3.4 循环日志记录和归档日志记录
15.3.5 修改事务日志模式
15.4 备份
15.4.1 离线备份
15.4.2 在线备份
15.4.3 表空间备份
15.4.4 增量备份
15.5 恢复
15.5.1 版本恢复
15.5.2 前滚恢复
15.5.3 崩溃恢复
15.6 常见的恢复场景
15.6.1 整个数据库意外删除和损坏
15.6.2 表空间容器意外丢弃或损坏
15.6.3 恢复到时间点
15.7 小结
15.8 实践与练习
第16章 PureXML技术应用
视频讲解:55分钟
16.1 pureXML技术简介
16.2 创建可以存储XML数据的DB2数据库
16.3 创建具有XML列的表
16.4 样本数据
16.5 XML模式存储库
16.5.1 XML模式存储库概念
16.5.2 增大应用程序堆栈大小配置参数
16.5.3 增大代理程序堆栈大小配置参数
16.5.4 编写XML模式文档
16.5.5 向XSR注册XML模式
16.5.6 删除XSR中的XML模式
16.6 将XML文档插入到XML类型的列中
16.6.1 插入时针对XML模式验证XML文档
16.6.2 插入时不验证XML文档
16.7 小结
16.8 实践与练习
第17章 XQuery技术的使用
视频讲解:49分钟
17.1 XQuery基础
17.1.1 XQuery查询的组成部分
17.1.2 基本规定
17.1.3 XML名称空间和QName
17.1.4 序言
17.1.5 表达式
17.2 查询XML数据
17.2.1 界面查询表中XML数据
17.2.2 如何选择查询XML数据的语言
17.2.3 用普通SQL查询XML数据
17.2.4 XQuery和嵌入了SQL的XQuery
17.2.5 SQLXML
17.3 更新XML数据
17.3.1 使用命令更新XML数据
17.3.2 变换表达式
17.4 小结
17.5 实践与练习
第18章 数据移动
视频讲解:68分钟
18.1 数据移动概述
18.2 文件格式
18.2.1 DEL格式
18.2.2 ASC格式
18.2.3 PCIXF格式
18.2.4 WSF格式
18.2.5 CURSOR格式
18.3 数据的导出
18.3.1 使用EXPORT导出数据
18.3.2 EXPORT命令格式及选项
18.4 数据的导入
18.4.1 使用IMPORT导入数据
18.4.2 IMPORT命令格式及选项
18.5 数据的装入
18.5.1 装入操作的4个阶段
18.5.2 使用LOAD清空表数据
18.5.3 LOAD实用程序
18.6 复制表
18.7 常见问题
18.7.1 加载的数据是Excel格式
18.7.2 导出加载的数据不是逗号双引号分隔
18.7.3 文件中的列比要导入的表中的字段多
18.7.4 导入导出大字段(LOB)
18.7.5 导入identity数据
18.7.6 数据移动出现乱码
18.7.7 表数据从一个表空间迁移到另一个表空间
18.8 小结
18.9 实践与练习
第19章 事务与锁
视频讲解:27分钟
19.1 数据库事务
19.2 事务日志记录
19.2.1 控制事务日志记录的参数
19.2.2 日志文件存储的位置
19.3 并发性控制
19.4 锁
19.4.1 锁的基本概念
19.4.2 行级锁和表级锁的模式
19.4.3 获取不同级别的锁的方法
19.5 隔离级别
19.5.1 隔离级别的种类
19.5.2 设置数据库的事务隔离级别
19.5.3 重写隔离级别(WITH从句)
19.5.4 继承隔离级别
19.5.5 锁避免和隔离
19.6 小结
19.7 实践与练习
內容試閱 :
丛书说明:软件开发视频大讲堂丛书(第1版)于2008年8月出版,因其编写细腻,易学实用,配备全程视频等特色,在软件开发类图书市场上产生了很大反响,绝大部分品种在全国软件开发零售图书排行榜中名列前茅,2009年多个品种被评为全国优秀畅销书。软件开发视频大讲堂丛书(第2版)于2010年8月出版,出版后,绝大部分品种在全国软件开发类零售图书排行榜中依然名列前茅。丛书中多个品种被百余所高校计算机相关专业、软件学院选为教学参考书,在众多的软件开发类图书中成为最耀眼的品牌之一。丛书累计销售40多万册。软件开发视频大讲堂丛书(第3版)于2012年8月出版,根据读者需要,增删了品种,重新录制了视频,提供了入门学习实例应用模块开发项目开发能力测试面试等各个阶段的海量开发资源库。因丛书编写结构合理、实例选择经典实用,丛书迄今累计销售90多万册。软件开发视频大讲堂丛书(第4版)在继承前3版所有优点的基础上,修正了前3版图书中发现的疏漏之处,并结合目前市场需要,进一步对丛书品种进行了完善,对相关内容进行了更新优化,使之更适合读者学习,为了方便教学,还提供了教学课件PPT。DB2是IBM公司研制的一种关系型数据库系统,它主要应用于大型应用系统,具有较好的可伸缩性,可支持从大型机到单用户环境,可以应用于OS2、Windows等平台。DB2提供了高层次的数据利用性、完整性、安全性、可恢复性,以及小规模到大规模应用程序的执行能力,具有与平台无关的基本功能和SQL命令。另外,它还采用了数据分级技术,能够使大型机数据很方便地下载到LAN数据库服务器,使得客户机服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地以及远程连接透明化。
本章主要介绍默认值、约束、索引和表别名。默认值是在用户没有明确指定某列值的情况下,系统自动填充预先定义或指定的值;约束是为了使信息符合特定的限制或规则;索引是为了提高数据的查阅速度;别名是为了方便对表或视图的操作。
通过阅读本章,您可以:
:掌握默认值和约束的用法
:掌握索引的创建、修改和删除
:掌握别名的创建、修改和删除
10.1默认值和约束 数据通常必须符合特定限制或规则,这些限制可能适用于单条信息(例如,格式和序号),也可能适用于若干条信息,下面是一些常用的限制规则。
1.列数据值的可空性
空值表示未知状态。默认情况下,所有内置数据类型都支持空值的存在。但是,一些业务规定可能要求必须始终为某些列提供值,例如,员工编号。对于这种情况,可以使用NOT NULL约束来确保始终不会为给定表列指定空值。为特定列定义NOT NULL约束后,尝试在该列中放入空值的任何插入或更新操作都将失败。
2.默认列数据值
正如一些业务规则要求必须始终提供值一样,其他业务规则可能要求该值应该是什么,例如,学生表中的性别必须是男或女。列默认值约束用于确保在表中添加给定表列没有特定值的行时,始终为该列指定预定义的值。为列提供的默认值可以是空值、与该列的数据类型兼容的约束值或数据库管理器提供的值。
3.键
键是表或索引中可用来标识或访问特定数据行的单列或一组列。任何列都可以是键的一部分,并且同一列可以是多个键的一部分。
由单列组成的键称为原子键;由多列组成的键称为组合键。
除了具有原子或组合属性外,还根据使用键实施约束的方式对键进行了分类:
(1)唯一键用来实施唯一约束。
(2)主键用来实施实体完整性约束(主键是一种特殊的唯一键,它不支持空值)。
(3)外键用来实施引用完整性约束(外键必须引用主键或唯一键,外键没有相应的索引)。
通常在声明表、索引或引用约束定义期间指定键。
4.完整性约束
约束是对可在表中插入、删除或更新的值进行限制的规则。
约束包括非空约束、检查约束、唯一约束(也称为唯一键约束)、主键约束、外键约束(也称为引用约束、引用完整性约束或参照约束)。
10.1.1 默认值 在表中新增记录时,如果用户没有明确指定某些列的值,在这种情况下,由系统自动填充的为某些列和数据类型预先定义或指定的值,称为默认值。
各种数据类型的默认值如下。
(1)NULL:Char、VarChar等字符串类型。
(2)0:用于小整数、整数、十进制、单精度浮点数和双精度浮点数。
(3)空白:用于固定长度字符串和固定长度双字节字符串。
(4)零长度字符串:用于变长字符串、二进制大对象、字符大对象和双字节字符大对象。
(5)日期:这是插入行时的系统日期(从CURRENT_DATE专用寄存器获取)。将日期列添加至现有表时,将为现有行指定日期2001年01月01日。
(6)时间或时间戳记:这是插入语句时的系统时间或系统日期时间(从CURRENT_TIME专用寄存器获取)。将时间列添加至现有表时,将为现有行指定时间00:00:00或包含日期0001年01月01日和时间00:00:00的时间戳记。
(7)用户定义的单值数据类型:这是系统为用户定义的单值数据类型的基本数据类型定义的默认值(强制类型转换为用户定义的单值数据类型)。
10.1.2 约束 约束只与表关联,它们是在创建表的过程中定义的(使用CREATE TABLE语句),或者是在创建表后添加至表定义的(使用ALTER TABLE语句)。可以使用ALTER TABLE语句来修改约束。在大多数情况下,随时都可以删除现有约束;此操作不会影响表结构和存储在表中的数据。
1.创建和修改约束
可以使用ALTER TABLE语句将约束添加至现有表。
约束名不能与在ALTER TABLE语句内指定的任何其他的约束相同,且必须在该表内是唯一的(这包括定义的任何引用完整性约束的名称)。在成功执行该语句之前,会对照新条件检查现有数据。
要修改此约束,必须先删除此约束,然后重新创建。
在某个列上定义约束可以有4种方式:
界面上创建表时添加约束。
SQL命令创建表时添加约束。
创建表后在界面中添加约束。
创建后用SQL语句添加约束。
创建和修改唯一约束的方法和步骤如下:
可以将唯一约束添加至现有表。约束名不能与在ALTER TABLE语句内指定的任何其他约束相同,且必须在该表内是唯一的(这包括定义的任何引用完整性约束的名称)。在成功执行该语句之前,会对照新条件检查现有数据。
使用ALTER TABLE语句的ADD CONSTRAINT选项来定义唯一约束。
【例10.1】在学号上创建一个唯一约束(实例位置:光盘\TM\sl\10\1)。
ALTER TABLE mr.学生表
DROP PRIMARY KEY
--首先要删除学号上已有的主键,才能重新创建学号上的唯一约束
ADD CONSTRAINT xsb_unique_key_name UNIQUE学号
--在学号上添加唯一约束,约束名为xsb_unique_key_name
本例运行结果如图10.1所示。
图10.1 添加唯一约束
创建和修改主键约束的方法和步骤如下:
可以将主键约束添加至当前表中。约束名必须在表内是唯一的(这包括定义的任何引用完整性约束的名称)。在成功执行该语句之前,会对照新条件检查现有数据。
创建主键约束的语句语法为:
ALTER TABLE table_name
ADD CONSTRAINT primary_key_name
PRIMSRY KEY { column_name }[,n];
不能修改现有主键约束。要将另一列或另一组列定义为主键,必须先删除现有主键定义,然后再重新创建。
创建和修改检查约束的方法和步骤如下:
当添加表检查约束时,插入或更新该表的程序包和高速缓存的动态SQL可能被标记为无效。
创建检查约束的语句语法为:
ALTER TABLE table_name
ADD CONSTRAINT check_name CHECK logical_expression
[NO ENFORCED | ENFORCED]
[ENABLE QUERY OPRIMIZATION];
【例10.2】假如学生表的性别列上还没有约束,在学生表的性别列上添加约束,性别只能为男或女(本实例的约束已经添加,不能再添加相同约束,读者可以将约束删除,然后重新用SQL语句添加)(实例位置:光盘\TM\sl\10\2)。
ALTER TABLE mr.学生表
ADD CONSTRAINT xsb_check CHECK 性别 = ''男'' OR 性别 =''女''
--性别只能是男或女
ENFORCED --强制此约束
ENABLE QUERY OPTIMIZATION; --在查询优化期间考虑此约束
本例运行结果如图10.2所示。
图10.2 检查约束
【例10.3】在课程表上的开课学期上添加约束开课学期必须是1~8(这个约束实际上已经添加过了,不能再次添加相同的约束,想要添加一定要删除以前添加过的约束)(实例位置:光盘\TM\sl\10\3)。
ALTER TABLE mr.课程表
ADD CONSTRAINT kcb_check CHECK 开课学期0 AND 开课学期
--开课学期只能为1~8
ENFORCED --强制此约束
ENABLE QUERY OPTIMIZATION;
--在查询优化期间考虑此约束
本例运行结果如图10.3所示。
图10.3 检查约束
创建和修改外键约束的方法和步骤如下:
外键约束(也称为引用约束或引用完整性约束)能够定义表间以及表内必须的关系。外键是表中的一列或一组列,要求其值与其父表或昵称中某行的至少一个主键值相匹配。
创建外键(引用)约束的语句语法为:
ALTER TABLE table_name
ADD CONSTRAINT foreign_key_constraint_name
FOREIGN KEY {column_name} [,n]
REFERENCES
parent_table_name {column_name} [,n]
ON DELETE delete_action_type
ON UPDATE update_action_type
[ENFORCED | NOT ENFORCED]
[ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION];
其中:
delete_action_type ::=
NO ACTION | RESTRICT | CASCADE | SET NULL
update_action_type ::=
NO ACTION | RESTRICT
一个表可以同时创建多个外键约束。要修改此约束,必须先删除此约束,然后再重新创建。
数据库管理器通过强制执行与每个引用约束关联的一组规则来处理这类情况。这组规则包括:插入规则、更新规则、删除规则,下面分别进行介绍。
(1)插入规则。引用约束的插入规则为:外键的非空插入值必须与父表的父键的某些值相匹配。如果组合外键的值的任何组成部分为空,那么该值为空。指定外键时,此规则是隐式的。
(2)更新规则。引用约束的更新规则是在定义引用约束时指定的。选项有NO ACTION和RESTRICT。在更新父表的某行或从属表的某行时应用更新规则。
如果是父行,更新父键的某列中的值时,下列规则适用:
如果从属表中的任何行与该键的原始值相匹配,在更新规则为RESTRICT的情况下,会拒绝更新。
如果在更新语句完成时,从属表中的任意行没有相应的父键(排除AFTER触发器),当更新规则为NO ACTION时,会拒绝更新。
如果是从属行,当指定外键时,NO ACTION更新规则是隐式的。NO ACTION意味着更新语句完成时,外键的非空更新值必须与父表的父键的某些值相匹配。
如果组合外键的值的任何组成部分为空,那么该值为空。
(3)删除规则。引用约束的删除规则是在定义引用约束时指定的。选项有NO ACTION、RESTRICT、CASCADE或SET NULL。只有当外键的某些列允许空值时,才能指定SET NULL。
在删除父表的某行时应用引用约束的删除规则。更确切地说,当父表的某行是删除或传播删除操作的对象,且该行在引用约束的从属表中具有从属项时,该规则适用。考虑这样一个例子,其中P是父表,D是从属表,而P是充当删除或传播删除操作的对象的父行。删除规则的工作方式如下:
对于RESTRICT或NO ACTION,发生错误时不会删除任何行。
对于CASCADE,删除操作会传播至表D中的P的从属项。
对于SET NULL,表D中的P的每个从属项的外键的每个可空列被设置为空。
【例10.4】在成绩表上添加两个关键字cjb_foreign_key1和cjb_foreign_key2(实例位置:光盘\TM\sl\10\4)。
ALTER TABLE mr.成绩表
ADD CONSTRAINT cjb_foreign_key1
FOREIGN KEY 学号 REFERENCES mr.学生表学号
ON DELETE CASCADE
ON UPDATE RESTRICT
ENFORCED
ENABLE QUERY OPTIMIZATION
ADD CONSTRAINT cjb_foreign_key2
FOREIGN KEY课程号 REFERENCES mr.课程表课程号
ON DELETE RESTRICT
ON UPDATE NO ACTION
ENFORCED
ENABLE QUERY OPTIMIZATION;
本例运行结果如图10.4所示。
图10.4 添加外键
3.删除约束
可以使用含有DROP或DROP CONSTRAINT子句的ALTER TABLE语句显式删除表约束,或作为DROP TABLE语句的结果将其隐式删除。
删除唯一约束的方法如下。
使用ALTER TABLE语句的DROP UNIQUE子句,删除现有唯一约束以及依赖于此唯一约束的所有引用约束的定义。删除此唯一约束使引用该约束的任何程序包或高速缓存的动态语句无效。运行下面命令来删除表的唯一约束unique_constraint_name:
ALTER TABLE table_name
DROP UNIQUE unique_constraint_name;
删除主键约束的方法如下。
使用ALTER TABLE语句的DROP PRIMARY KEY子句删除主键以及依赖于此主键的所有引用约束的定义。运行下面的命令来删除现有表的主键:
ALTER TABLE table_name
DROP PRIMARY KEY;
如果表中没有主键,可以向表中插入相同的行。
删除检查约束的方法和步骤如下:
删除检查约束时,与该表有INSERT或UPDATE关系的所有程序包和高速缓存的动态语句将变得无效。可以在SYSCAT.CHECKS目录视图中查找所有检查约束的信息。
【例10.5】查询MRKJ数据库中目前所有的检查约束(实例位置:光盘\TM\sl\10\5)。
实现步骤如下。
(1)连接到MRKJ数据库:
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;
删除外键(引用)约束的方法如下。
使用ALTER TABLE语句的DROP FOREIGN KEY子句删除现有外键约束。运行以下命令来删除现有外键约束foreign_key_name:
ALTER TABLE table_name
DROP FOREIGN KEY foreign_key_name;
当删除外键约束时,包含下列语句的程序包或高速缓存的动态语句可能被标记为无效:
插入或更新包含外键表的语句。
更新或删除父表的语句。
10.2索 引 我们都查过字典,当查阅字典时,为了提高查阅速度,并不是从字典的第一页开始顺序查找,而是首先查看字典的目录索引,找到需要的这个字在目录中所列的页码,然后根据这一页码直接找到该字所在的页。在数据库中,为了从大量的数据中迅速找到需要的内容,也采用了类似于字典目录这样的索引技术,使得数据查询时不必扫描整个数据库,就能迅速获取到所需要的内容。下面介绍DB2的索引技术。
10.2.1 索引的概念 使用数据行中的列值来标识整个行,可能需要一列或多列来标识该行,这种列被称为键。一个列可以在多个键中使用。索引是一个或多个键的集合,每个键指向表中的一行。SQL优化器自动选择最有效率的访问表中数据的方法。当确定最快速的数据访问路径时,优化器会将索引考虑在内。
在数据库系统中建立索引主要有以下作用:
(1)快速存取数据。
(2)保证数据记录的唯一性。
(3)实现表与表之间的参照完整性。
(4)在使用ORDER BY、GROUP BY子句进行数据检索时,利用索引可以减少排序和分组的时间。
将数据添加到表时,除非已对该表和正在添加的数据执行了其他操作,否则简单地将数据追加至该表的底部。数据是无序的,搜索特定数据行时,必须检查从第一行到最后一行的每个表行。将索引用作按顺序访问表中数据的一种方法,该顺序在其他情况下可能不可用。
索引按键中的值进行排序。键可以是唯一的,也可以是非唯一的。每个表应该至少有一个唯一键;但还可以有其他唯一键。每个索引正好有一个键,例如,可以使用员工编号(唯一)作为一个索引键,并使用部门号(非唯一)作为另一个索引键。
索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。
设计索引的原则如下:
(1)在创建索引时要记住,虽然它们可以提高读取性能,但会对写性能产生负面影响。这是因为对于数据库管理器写入表中的每行,它还必须更新任何受影响的索引。因此,只有在会明显提高整体性能时,才应创建索引。
(2)在创建索引时,还必须考虑表结构和经常对这些表执行的查询的类型。例如,经常发出查询的WHERE子句中出现的列是索引的优秀候选者,但是,在较少运行的查询中,索引对INSERT和UPDATE语句的性能产生的负面影响可能超过其所带来的好处。
(3)同样,在经常运行的查询的GROUP BY子句中出现的列可能会从创建索引中获益,尤其在用于分组行的值的数目小于要分组的行数时。
10.2.2 索引的分类 可以按照两种分类角度给索引分类:按照唯一性分类,可分为唯一索引、非唯一索引;按照索引的键顺序与数据的物理存储顺序是否一致,可分为集群索引和非集群索引。
1.唯一索引和非唯一索引
唯一索引是这样的一种索引,它通过确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性。
尝试为已经包含数据的表创建唯一索引时,将检查组成该索引的列中的值是否唯一;如果该表包含具有重复键值的行,那么索引创建过程将失败。为表定义唯一索引后,将在插入和更新操作期间强制唯一性。除了强制数据值的唯一性外,唯一索引还可以用来提高查询处理期间检索数据的性能。
另外,非唯一索引不用于对与它们关联的表强制执行约束。相反,非唯一索引通过维护频繁使用的数据值的排序顺序,仅仅用于提高查询性能。
2.集群索引和非集群索引
索引体系结构分为集群或非集群。集群索引是根据数据在磁盘上排序所依据的那个键构建的索引。在某些关系数据库管理系统中,集群索引的叶子节点对应于实际数据,而不是对应于指向位于其他地方的数据的指针,非集群索引的叶子节点就对应于这种指针。
由于集群索引的叶子级别对应于实际数据这个事实,表中的数据将根据索引进行排序,因此,给定表中只能存在一个集群索引,但可以存在许多非集群索引。
非集群索引是在任何键的基础上构建的索引。每种关系都可以有一个集群索引和许多个非集群索引。集群索引通常将实际记录存储在数据结构中,因此其速度比非集群索引要快很多。非集群索引被强制仅将记录标识存储在数据结构中,并且需要至少一个其他IO操作才能检索到实际记录。
重组与所选索引相关的表将对数据重新建立集群。建立了集群的索引对于带有范围谓词的列非常有用,因为它允许对表中的数据作更有效的顺序访问。由于相似的值在同一数据页上,从而减少了页访问次数。
通常,表中只有一个索引可以具有较高的集群度。
10.2.3 创建索引 相同列上相同排序方式的索引被认为是匹配的。如果要在主键所在的列上创建索引,必须先删除主键约束,才能重新在主键上创建索引。
如果要在课程表上按课程名建立唯一索引,索引组织方式为非集群索引,那么在DB2中,可利用控制中心创建上述索引,也可以利用SQL命令通过命令编辑器建立索引。
用命令创建表的索引的语法格式如下:
CREATE [UNIQUE] INDEX index-name
ON column-name [ASC | DESC]
[NOT PARTITIONED]
[IN tablespace-name]
[SPECIFICATION ONLY]
[INCLUDE not-enforced-unique-column-name ]
[xml-index-specification | CLUSTER | EXTEND USING index-extension-name
[constant-expression]]
[PECFREE 10 | PCTFREE]
[LEVEL2 PCTFREE]
[MINPCTUSED]
[ALLOW REVERSE SCANS | DISALLOW REVERSE SCANS]
[PAGE SPLIT]
[COLLECT [[SAMPLED] STATISTICS] [DETAILED]
参数说明如表10.1所示。
表10.1 创建索引语法的参数说明
参 数
描 述
UNIQUE
为表或视图创建唯一索引(即不允许存在索引值相同的两行),如果创建索引时表已经包含了重复的关键字,则不能创建唯一索引
index-name
索引名,包含显式或隐式的模式名,模式名不能是SYSIBM、SYSCAT、SYSFUN或SYSSTAT
table-name
必须是一个基本表、编目中描述的物理表或已声明的临时表。已声明的临时表的模式名必须是SESSION
nickname
表的昵称
column-name
列名,该列将成为索引关键字的成员列。可以为索引指定多个列
ASC
索引文件按升序建立,默认排序方式
DESC
索引文件按降序建立
NOT PARTITIONED
指明索引必须搜索表的所有数据分区
table-name
数据分区的表名
tablespace-name
指定将创建的索引所处的表空间,这个子句只有在分区表上才被支持
SPECIFICATION ONLY
指明创建的索引将应用到昵称所指定的数据源表,只有指定了昵称时才指定SPECIFICATION ONLY
续表
参 数
描 述
INCLUDE not-enforced-unique-
column-name
指定添加到索引列(column-name所指的那些列)集合的其他列(not-enforced- unique-columnd-name所指的那些列)。这个子句中的任何列都不强制唯一。这些添加的列必须强制唯一的列区分开,不能在声明的临时表上使用这个子句。如果指定昵称时使用了EXTEND USING if nickname is specified或者是XML列上的索引都不能使用这个子句
CLUSTER
指明是在表上创建集群索引。一个表上只存在一个集群索引,因此如果CLUSTER用于定义表上的非集群索引时,CLUSTER可以省略
EXTEND USING index-extension-
name
给管理索引的索引扩展的命名。如果指定了这个子句则只能指定一个列名,这个列必须是结构数据类型或独立数据类型。index-extension- name必须是编目中描述的索引扩展的名称。对于独立数据类型,这个列必须完全匹配索引扩展中的相应的关键字;对于结构数据类型,索引扩展中的相应关键字类型必须与列类型相同或者是列类型的超类。临时表不能用这个子句
constant-expression
指定索引扩展需要的所有参数
PCTFREE
指定建立索引时每个索引页保留百分之多少作为空余空间的值,可以是0~99,第一个值添加到索引页时没有任何限制,其他值添加到索引页时,每个非叶子索引页要保留百分之min(10,)的空余空间。默认值是10
LEVEL2 PCTFREE
指定建立索引时每个二级索引页保留百分之多少作为空余空间,这个值可以是0~99。如果没有指定LEVEL2 PCTFREE,则每个非叶子索引页中保留百分之min(10,)的空余空间。如果指定了LEVEL2 PCTFREE,则二级中间索引页保留百分之的空余空间,3级或者更高级别的中间索引页保留百分之min(10,)的空余空间
MINPCTUSED
指定叶子索引页是否在线合并,并指定叶子索引页中已用空间的最小的百分数的门槛值。如果从叶子索引页移除一个键后,叶子索引页中已用空间的百分数小于等于百分之,系统就试图将该叶子索引页上剩余的键与相邻索引页上的那些键合并。如果这些索引页上有足够的空间,合并就被进行,且删除其中一个索引页。的值可以是0~99。为了具有较好的性能,推荐采用小于等于50的值。指定这个选项会对更新和删除性能产生影响。对于2型索引,只有包含独占锁的表执行删除或更新操作时才进行合并,如果表上的独占锁不存在,在更新或删除操作期间,键就被标记为假删除,且不进行合并。最好使用REORG INDEXES的CLEANUP ONLY ALL选项来合并叶子索引页,而不是使用CREATE INDEX的MINPCTUSED选项。临时表不能使用MINPCTUSED子句
DISALLOW REVERSE SCANS
指明索引仅支持前向索引
ALLOW REVERSE SCANS
指明索引支持前向和反向搜索
PAGE SPLIT
指定索引分页动作,默认值是SYMMETRIC
SYMMETRIC
指定按照索引的关键字将索引页对称地分开
HIGHLOW
当向索引关键字对应的列插入值时遵循特定的模式,按照高效利用索引页空间的方式分割索引页。对索引关键字的子集,索引中最左的一列或多列必须包含相同的值,索引中最右一列或多列必须包含递增递减的值
LOW
指定按照高效利用索引页空间的方式分割索引页
COLLECT STATISTICS
指明索引创建期间收集基本的索引统计信息
DETAILED
指明索引创建期间收集延伸的统计信息(CLUSTER FACTOR和PAGE_FETCH_ PAIRS)
SAMPLED
指明编译延伸的索引统计信息时可以采样
【例10.6】在课程表上按课程名建立唯一索引,索引组织方式为非集群索引。
1.通过控制中心建立表的索引
建立索引的方法如下:
(1)在控制中心对象视图中选择数据库下的表文件夹,然后在内容窗格中找到,然后单击鼠标右键,在弹出的快捷菜单中选择创建索引命令,如图10.6所示。
图10.6 创建索引菜单
(2)在打开的创建索引对话框中,在XML列选项区选择否选项。可以看出DB2已经自动生成了表模式和表名,并且不允许修改。单击下一步按钮,如图10.7所示。
(3)指定新索引的模式和名称。使用默认的索引模式MR,用户也可以选择其他模式。输入索引名INDEX_KCB_KCM,输入注释课程表的课程名列上的唯一非集群索引,单击下一步按钮,如图10.8所示。
(4)指定索引键。选中强制唯一性复选框,在可用的列列表中选择课程名,然后单击按钮,这时课程名选项就添加到了选择的列列表中。选中升序单选按钮,单击下一步按钮,如图10.9所示。
图10.7 自动生成了表模式和表名
图10.8 输入索引模式、索引名和注释
图10.9 指定索引中的索引键
(5)指定索引选项。可以指定索引的详细特性,单击下一步按钮,接受默认选项,如图10.10所示。
图10.10 指定索引选项
(6)复查在单击完成按钮之后将执行的操作。如果单击显示SQL按钮,可以查看SQL代码。单击完成按钮,如图10.11所示。此时完成了索引INDEX_KCB_KCM的创建。
图10.11 复查在单击完成之后将执行的操作
2.通过命令建立表的索引
CONNECT TO mrkj USER mr USING 1;
--创建索引前首先要连接数据库
CREATE UNIQUE INDEX --UNIQUE表示唯一索引
mr.index_kcb_kcm
ON mr.课程表 课程名 ASC
--索引的关键字是课程表中的课程名,因为是唯一索引,所以课程名必须唯一
--ASC表示索引关键字的值按照课程名升序排列
--没有用关键字CLUSTER,表示这是个非集群索引
PCTFREE 10 --每个非叶子索引页保留10%作为空余空间
MINPCTUSED 10
--叶子索引页中已用空间低于10%时就将该叶子索引页与相邻索引页合并
ALLOW REVERSE SCANS --支持索引页前向和反向搜索索引
PAGE SPLIT SYMMETRIC --按照索引的关键字将索引页对称的分开
COLLECT SAMPLED DETAILED STATISTICS;
--索引创建期间收集基本的和延伸的(DETAILED)
--索引统计信息(STATISTICS),并且可以采样(SAMPLED)
COMMENT ON INDEX mr.index_kcb_kcm IS ''课程表的课程名列上的唯一非集群索引'';
--索引的注释
运行结果如图10.12所示。
图10.12 使用命令创建索引
10.2.4 查看已创建的索引 有两种方法可以查看已创建的索引:可利用控制中心查看已创建的索引,也可以利用SQL命令查看已创建的索引。
【例10.7】查看已创建的索引INDEX_KCB_KCM。
1.在控制中心窗口中查看已创建的索引
成功创建索引后,在控制中心对象视图中选择数据库下的索引文件夹,右面内容窗格中选择已创建的索引INDEX_KCB_KCM,在该索引单击鼠标右键,在弹出的快捷菜单中选择显示相关内容命令,之后可以查看该索引的相关信息,如图10.13、图10.14和图10.15所示。
图10.13 查看索引信息
图10.14 在命令编辑器中查看已经创建的索引
图10.15 显示SQL语句
2.使用命令查看已经创建的索引
在命令编辑器中,运行下面的命令也可以查询已经创建的索引INDEX_KCB_KCM,如图10.16所示。
select * from sysibm.sysindexes
where name =''INDEX_KCB_KCM'' AND CREATOR = ''MR'';
图10.16 查看已经创建的索引
10.2.5 修改索引 如果要修改索引,必须先删除该索引,然后再次创建它。没有ALTER INDEX语句。
例如,不能在未删除先前定义并创建新索引的情况下将列添加至键列的列表,可以使用COMMENT语句添加注释来描述索引的用途。
10.2.6 重命名索引 使用RENAME INDEX语句来重命名现有索引。
重命名索引的语法如下:
RENAME INDEX source_index_name TO target_index_name
参数说明如下。
source_index_name:要重命名的现有索引的名称(该名称可以有模式名),必须标识数据库中已存在的索引。它不能是已声明的全局临时表的索引名。模式名不能是SYSIBM、SYSCAT、SYAFUN或SYSSTAT。
target_index_name:索引新名称(不能包含模式名)。源索引的模式名用于限定索引的新名称。新索引的限定名不能标识数据库中已经存在的索引。
【例10.8】将索引mr.index_kcb_kcm更名为new_index_name(实例位置:光盘\TM\sl\10\6)。
RENAME INDEX mr.index_kcb_kcm TO new_index_name;
本例运行结果如图10.17所示。