加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

db2 load 问题

(2009-11-20 18:29:21)
标签:

杂谈

    有这样一个业务功能,不同机器上的两个库A,B,A库中的数据都是由B库中的数据定期倒入的,突然有一天同事说管理系统中统计出的数据有问题,于是用同样的SQL语句在两个库中执行发现得出的结果大相径庭,这就很奇怪了,按道理说得出的数据应该一样.于是把两个库里的用户表内容全部检索出来,发现了非常严重的问题.

同样的用户在两个表中居然是不同的用户ID.这就证明倒入数据时出了问题.

于是看了一下建表语句.其中用户ID是:

 USER_ID NUMERIC(9,0) NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY ( START WITH +100000001 , INCREMENT BY +1 , NO CACHE ),

之前的倒入倒出语句:

export to d:\tables\TAB_USER   of IXF  messages   d:\tables\TAB_USER.exp.txt                 select * from DB2ADMIN.TAB_USER ORDER BY USER_ID

 

 

import from z:\TAB_USER  of IXF MODIFIED BY IDENTITignore     messages  d:\tables\TAB_USER.imp.txt        REPLACE_CREATE INTO TAB_USER

其中MODIFIED BY IDENTITignore   该修饰符规定输入文件中的任何标识值都被忽略,所以导致自增列了问题.于是试着用另一种方式导入.

load from D:\USER\TAB_USER                   of IXF MODIFIED BY IDENTITYOVERRIDE     messages   d:\tables\TAB_USER.imp.txt          REPLACE INTO TAB_USER

load命令中的modified by identityoverride可以保证导入数据时那些自增字段的值和原数据库中的数据一致.开始导入导出采用DEL格式.发现导入的数据中文部分全部显示乱码,于是就采用了IXF格式.结果显示数据全部一致.使用LOAD的缺点就是他没有一个选项,在目标表不存在的时候系统自动建立.为了不想每次都手动去创建表.就导出一个空文件,然后再导入到目标表这样可以清空原表.如果用delete的话,下次导入自增列会接着它上次的号码生成.

load from d:\tables\TAB_EMPFILE of IXF  replace into tab_user

*而且load from 后面的源文件只能是本地的不可以是映射其它机器上的,这样每次导表时还得先把源文件拷贝到另一台机器上.然后在另一台机器上LOAD比较麻烦.

 

 

 

[标题]
用load命令和identityoverride参数向有identity列的表中装载数据后的注意事项
问题描述:
对于有Identity列,并从1开始的表, 当用LOAD命令装载数据后, 如何调整Identity列的值


解答:

对于有Identity列,并从1开始的表, 当用LOAD命令装载数据后, 再次向该表中插入时, Identity列
会继续沿着load装载前的值继续插入,而不会根据load的数据自动调整,这样就有可能出现重复的值。

为此在DB2版本7补丁程序2之后,在ALTER TABLE命令中新增加了相应的功能,
可按如下步骤处理:
1. 建表,并插入数据;
2. 用load命令装载数据;
3. 用select max() from table命令得到此时identity列的最大值;
4. 用命令 "ALTER TABLE <tablename> alter column <column> restart with <nextval>

此后,再向表中插入数据, identity列将从nextval重新开始生成。

 

0

阅读 收藏 喜欢 打印举报/Report
前一篇:db2
后一篇:db2 merge
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有