DB2实验教程:移动与操纵数据

发布时间:2019-08-01编辑:脚本学堂
DB2实验教程:移动与操纵数据

实验任务:
A. 学习Insert、Select和Update等sql语句的应用;
B.使用import工具从一文件读取数据写入表格;
C.使用load工具从一文件读取数据快速写入表格;
D. 建立异常表;
E.管理检查约束,触发器以及检查暂挂状态。

一. 数据插入、删除
1. 利用SQL语句插入数据,并查看结果。
(1)将下列数据插入到表albums中(一次插入一行)
TITLE ARTNO ITEMNO
Greatest Hits1 1
Voice in the Wind2 5
在“控制中心”,右键单击表albums,选择“内容采样”,查看表中结果。
(2)将下列数据插入到表artists中
ARTNO NAME CLASSIFICATION BIO PICTURE
99 Double Dare R
Patti & CartwheelsS
1Alabama C
2Bogguss, Suzy S
3Black, ClintC
 Brooks, Garth C
5Chapin-Carpenter, MaryR
6Gill, Vince C
7Jackson, Alan C
8Judds C
在“控制中心”,右键单击表artists,选择“内容采样”,查看表中结果。
(3)重新进行⑴的插入操作,并查看albums表中的插入结果。
(4)将下列数据一次插入到表albums中
TITLEARTNO ITEMNO
American Pride1
Something Up My Sleeve2 4
Put Yourself in My Shoes5 7
在“控制中心”,右键单击表albums,选择“内容采样”,查看表中结果。
2. 删除数据
(1)删除表artists中ARTNO为99的记录信息。
(2)将表albums中TITLE为Voice in the Wind的记录删除。
(3)将CLASSIFICATION为R的演员的唱片集从albums表中删除。

二. 使用import工具导入数据到artists表,稍后执行脚本文件导入数据到albums和stock表。首先用用户名inst1登陆。
1. 使用import工具导入数据到artists表。
(1)导入数据
在控制中心中右键单击artists表,在弹出菜单中选择“导入”。在“导入表—artists”窗口中,按要求输入下列信息:
ü“导入文件”一栏输入X:......artists.exp;
ü“导入文件类型”设为集成交换格式(IXF);
ü“导入方式”设为INSERT;
ü“消息文件”一栏输入X:cf23art.msg,单击“确定”按钮。
(2)Windows命令提示符窗口中输入more < art.msg,查看消息文件中的警告或错误信息,并注意有多少行数据成功插入表中。
2. 在“命令中心”的脚本模式下分别运行脚本imp_albu和imp_sto,该脚本将数据导入到albums表和stock表中。脚本执行完毕后查看消息文件albums.msg和sto.msg是否有任何附加信息,并注意分别有多少行数据成功插入表中。

三. 创建异常表—artists,albums,stock
所有的异常表将存储在SMSEXP表空间,注意异常表的定义与原表非常相似,前N列的列名和数据类型与原表精确匹配。第N+1列为可选列,数据类型为timestamp。第N+2列也为可选列,且只有在第N+1列存在时才能被创建,该列必须定义成32KB或更大的CLOB类型,用来存放导致该行被拒的特定约束信息。
在命令中心脚本模式下导入并执行脚本crexptab,该脚本分别为artists、albums、stock创建异常表artexp、albexp、stoexp。
四. 备份数据库
后面的实验将使用Load Replace 命令装入数据,要使该操作可恢复,需要先将现有的数据进行备份。数据库备份与恢复的细节将会在以后的实验有所涉及。
在db2命令窗口中输入如下命令实现数据库备份操作:
X:
Cd
Md X:backup
Db2 force application all
Db2 backup db MUSICDB to X:backup

五. 使用load插入模式载入数据到concerts表
右键单击concerts表,在弹出菜单中选择“装入(L)”;在“类型”页,选择“将数据附加到表中”,在“文件”页,输入下列信息:
ü要载入文件为concerts.exp;
ü文件格式为ixf格式;
ü载入数据使用插入模式;
ü载入过程中所有消息重定向到concerts.msg文件当中。
ü在“调度任务执行”中,选择“立即执行而不保存历史任务”
在“总结”页面,查看相应的SQL语句,并点击“完成”。
 
查看消息文件concerts.msg,注意有多少行成功载入并插入到表中:
more < concerts.msg

六. 使用load工具的替换模式载入数据到表artists中
在命令中心运行脚本load_art,将数据装入到artists表中。
ü本次载入使用了与前次import不同的IXF输入文件,且使用了替换选项将先前导入的行替换掉。,在带有异常选项的载入过程中,所有违反唯一限制(主键或唯一索引)的数据行将会放入artists的异常表artexp中。
ü查看artexp表中是否存有那些违反artists上唯一键索引的数据行,在命令中新脚本模式下导入并执行selexp。
ü查看消息文件X:cf23load_art.msg内容:
more < load_art.msg

七. 使用SET INTEGRITY命令管理检查暂挂状态
1. 用Set Integrity 管理检查暂挂状态
(1)在命令中心导入并执行脚本seltab,该脚本将对表artists、stock、albums执行查询操作,查看执行结果。
(2)上述脚本执行后返回SQL0668原因代码1,命令中心中输入:
? SQL0668
因为这些表处于检查暂挂状态,所有对这些表的数据操作都不能执行,输出信息同时提示用户执行SET INTEGRITY语句以消除表的检查暂挂状态。
(3)在命令中心中执行脚本listtbst查看这些表上检查约束的状态。Artists表处于检查暂挂状态。
(4)SET INTEGRITY语句可被用来检查数据是否违反参照完整性约束,处于检查暂挂状态的表(artists表)应被指定一个与它对应的异常表。在命令中心中导入并执行setcsts_arts脚本来检查artists表中参照完整性约束。
(5)警告“sql3601”。在命令中心中输入? Sql3601,由帮助信息可知set integrity语句导致一个或多个表处于检查暂挂状态。
(6)命令中心中导入并执行listtbst脚本,执行后可见albums和stock表处于检查暂挂状态。
(7)命令中心中输入并执行脚本setcsts_2,为albums和stock表设置完整性,检查它们上的参照完整性,并指定它们的异常表。
(8)对artists、stock、albums表执行查询操作以确认这些表已消除检查暂挂状态,在命令中心中导入并执行脚本listtbst和seltab,执行结果表明检查暂挂状态都以消除。
2. 将异常表中的数据放回原来表中
(1)为解除检查暂挂状态,那些违反约束的行被移动到异常表中。在命令中心中导入并执行脚本selexp察看异常表中的数据。
(2)从stock移动到Stoexp的数据以及从albums移动到albexp的数据,这些数据的外键值都无法与artists表中的主键相匹配。执行下列SQL语句在artists表中插入一行数据:
insert into artists (artno, name, classification) values (100, 'Patti & Cart Wheels', 'S')
(3)现在要将stoexp和albexp表中的行分别插入到表stock和albums中,首先执行脚本selexp查看两异常表中数据,检查两异常表的MSG列,注意并不需要将N+1和N+2列数据插入到stock和albums表。
(4)在命令中心中导入并执行脚本insexp将stoexp和albexp中的数据插入到表stock和albums,insexp脚本也会对stock和albums执行查询操作以检查异常表中数据是否成功插入到原表。

八. 理解检查约束的强制执行
上节实验中为stock表的TYPE列添加的检查约束cctype,要查看该约束的内容,可以在“命令中心”中右键单击表stock并在弹出菜单中选择“改变”,再在“改变表—stock”窗口中选择“检查约束”标签页,选择cctype约束然后单击“更改”按钮,查看该约束的定义。
在命令中心中输入并执行如下SQL语句:
insert into stock values (302, 'V',100.00, 20)
输出结果返回SQL0545,该错误代码表明因为插入的数据不满足检查约束inst1.stock.cctype,所以要请求的操作不被允许。
在命令中心中输入并执行如下SQL语句:
insert into stock values (302, 'C',100.00, 20)
因为'C'满足检查约束cctype,所以该SQL语句成功执行。

九. 理解触发器的强制执行
回顾上节实验中在表stock的QTY列上创建的触发器reorder。选择命令中心的“脚本”标签页,然后输入并执行下列SQL语句:
select substr(text,1,200) from syscat.triggers where tabname='stock'
在命令中心中输入并执行下列SQL语句来修改stock表中itemno等于302的元组的qty字段值:
update stock set qty=3 where item=302
注意执行该语句后没有消息显示触发器是否被触发。
查看reorder表,检查在更新stock表qty列后触发器reorder是否被触发。在“命令中心”中输入:
terminate
connect to musicdb
select * from reorder
上节实验为表reorder建立了别名emptystock,在命令中心中输入并执行下列SQL语句:
select * from emptystock
输出结果表明对别名emptystock执行的查询操作会直接转化成对reorder表的操作。