关于ORACLE11G表DEFAULT属性使用的一个问题

乐在梦想成真 2012-05-16 03:52:47
我在做开发的时候,有一个表中的字段有default属性,遇到了一个问题一直没有解决,所以在论坛上来求教各位。
第一步建表:
create table dotest
(
num1 NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0),
num2 NUMBER(16,2),
num3 NUMBER(16,2),
num4 NUMBER(16,2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
next 8
minextents 1
maxextents unlimited
);
第二步生成一条数据:
INSERT INTO dotest(NUM2,NUM3) VALUES(100,100);
第三步修改数据:
UPDATE dotest SET NUM4 = NUM1 * 1.5;
然后你查询一下数据,看看字段NUM4的值,正常是300
SELECT * FROM dotest;

我在项目的生产机上发现了一个问题,生产环境上存在一个这样有default属性字段的表,我用update语句更新其中的一个字段,就如上边用NUM1【default属性的字段】来更新NUM4字段一样,困扰我的问题是更新后的结果一直是0,但是不管我怎么再做如上的测试也不会重现这个问题,最后没有办法我在生产机上重建了这个表,就没有这个问题了。

求教各位看看是否也遇到过这个问题,到底是什么原因导致的这个问题。
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐在梦想成真 2012-05-17
  • 打赏
  • 举报
回复
在建表的时候需要用num1 NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0),表建完之后你再去看建表的sql,就一变成了 num1 NUMBER(16,2) default NVL(NUM2,0) + NVL(NUM3,0) + 0,而且我确定默认值不是写的0,而是指定列之和。
a494910091 2012-05-16
  • 打赏
  • 举报
回复
num1 NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0) VIRTUAL ,
你要确定下 num1 是不是 有上面表红的 虚拟列的标识了!
小灰狼W 2012-05-16
  • 打赏
  • 举报
回复
哪有default?num1是虚拟列吧
如果是虚拟列的话,确实num4的值为300是正常的。我猜测,你原来的表中,num1并不是虚拟列,而是default为0的一个字段,因此update后,num4也是0。如果不是这样的话,那就可能是bug

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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