关于DB2 9.5 与 DB2 8 insert语句兼容问题

feiky 2010-06-23 10:40:11
在DB2 8中,当使用insert语句插入时,如果没有指定具体的列,DB2插入时是不会处理的,比如表A(a,b,c,d)四列,插入语句 insert into A(A,C,D) VALUES('A','C','D') 这样的话DB2 8就收到后编译就只处理这个3个列的插入值,b列默认不处理的

可以换到DB2 9.5 下后 同样的表,同样的INSERT语句 DB2 9.5编译后会变成 insert into A(A,B,C,D) VALUES('A',NULL,'C','D')
将没有显示的B列 设置为NULL值,这样程序就报错了

怎么能避免这种情况,让DB2 9.5只处理我设置了列的值

下面是2个系统下快照
DB2 8



执行数 = 1

编译数 = 1

最差准备时间(毫秒) = 0

最佳准备时间(毫秒) = 0

已删除的内部行 = 未收集

已插入的内部行 = 未收集

已读取的行 = 未收集

已更新的内部行 = 未收集

已写入的行 = 未收集

语句排序 = 未收集

总计执行时间(秒.毫秒) = 未收集

总计用户 CPU 时间(秒.毫秒) = 未收集

总计系统 CPU 时间(秒.毫秒) = 未收集

语句文本 = INSERT INTO "DB2ADMIN"."PZ_CURRENCY" ( "PC_ACCOUNT_MONTH", "PC_CODE", "PC_NAME", "PC_RATE", "PC_DEFAULT", "PC_STATUS" ) VALUES ( '201005', 'EUR', '娆у厓', 9.790000, 'N', '1' )


db2 9.5快照




执行数 = 1

编译数 = 1

最差预编译时间(毫秒) = 0

最佳预编译时间(毫秒) = 0

已删除的内部行 = 未收集

已插入的内部行 = 未收集

已读取的行 = 未收集

已更新的内部行 = 未收集

已写入的行 = 未收集

语句排序 = 未收集

语句排序溢出 = 未收集

总计排序时间 = 未收集

缓冲池数据逻辑读取 = 未收集

缓冲池数据物理读取 = 未收集

缓冲池临时数据逻辑读取 = 未收集

缓冲池临时数据物理读取 = 未收集

缓冲池索引逻辑读取 = 未收集

缓冲池索引物理读取 = 未收集

缓冲池临时索引逻辑读取 = 未收集

缓冲池临时索引物理读取 = 未收集

缓冲池 xda 逻辑读取 = 未收集

缓冲池 xda 物理读取 = 未收集

缓冲池临时 xda 逻辑读取 = 未收集

缓冲池临时 xda 物理读取 = 未收集

总计执行时间(秒.毫秒) = 未收集

总计用户 CPU 时间(秒.毫秒) = 未收集

总计系统 CPU 时间(秒.毫秒) = 未收集

生成统计信息耗用的总时间(毫秒) = 未收集

同步 runstats 耗用的总时间(毫秒) = 未收集

语句文本 = INSERT INTO DB2ADMIN.PZ_CURRENCY ( PC_ACCOUNT_MONTH, PC_CODE, PC_NAME, PC_FNAME, PC_CURSIGN, PC_CURUNIT, PC_RATE, PC_DEFAULT, PC_NOTES, PC_LASTUSERID, PC_LASTTIME, PC_STATUS ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )



像 PC_FNAME, PC_CURSIGN, 等这几个列都没在我的INSERT语句里,担9.5编译后都被加进来,设置了NULL值
结果报错


请高手指教
...全文
310 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero 2010-07-11
  • 打赏
  • 举报
回复
这两个数据库下边表结构完全一样吗?
包括没填入的列,是否为NULL。
maitianhust 2010-07-09
  • 打赏
  • 举报
回复
刚试过,在9.7下面可以执行的。 8.2不行,奇怪的是你SQL编译变化了。
maitianhust 2010-07-09
  • 打赏
  • 举报
回复
insert into A(A,B,C,D) VALUES('A',NULL,'C','D')
这样确实不行的,我以前也这样试过,报错,只能用你第一种写法。
liyan93834183 2010-06-23
  • 打赏
  • 举报
回复
不清楚你的insert语句为何编译时候还会变化了。。
feiky 2010-06-23
  • 打赏
  • 举报
回复
我是通过ODBC连接的,测试的时候只是插入insert语句

在2种环境下,一样的数据库,一样的表,一样的语句,最后通过cli解释后,就生成了不同的insert语句
liyan93834183 2010-06-23
  • 打赏
  • 举报
回复
你的语句是在哪执行的?
feiky 2010-06-23
  • 打赏
  • 举报
回复
不知道是不是有什么设置,哪些要修改的,这个问题很要命啊
liyan93834183 2010-06-23
  • 打赏
  • 举报
回复
9.5里也是不指定的不处理,不知道你的为何会这样
feiky 2010-06-23
  • 打赏
  • 举报
回复
现在有几百个表,不可能每个表的字段都要修改的

问题是在8下面跑,什么问题都没有,在9下就有这个问题

如果让9下能像8那样处理,不指定的列就不处理,而不是设置NULL
WWWWA 2010-06-23
  • 打赏
  • 举报
回复
一般数据库系统,在INSERT 中如果没有指定列名,会插入NULL,除非你设置了列的默认值。
yangxiao_jiang 2010-06-23
  • 打赏
  • 举报
回复
你 不设置值,当然就会 默认是 null了 ,你 可以把字段设置成有默认值的。
feiky 2010-06-23
  • 打赏
  • 举报
回复
问题是 我的B列是不能为null值的,系统给了NULL值,当然会报错
liyan93834183 2010-06-23
  • 打赏
  • 举报
回复
你是说
insert into A(A,C,D) VALUES('A','C','D')
执行后变成了
insert into A(A,B,C,D) VALUES('A',NULL,'C','D')
好像不是这样吧
不过即使变了,insert into A(A,B,C,D) VALUES('A',NULL,'C','D')
也是可以执行成功的,你的问题不是8.0和9.5的区别

5,891

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧