您的位置:首页 > 其它

ORA-01440: column to be modified must be empty to decrease precision or scale

2017-06-08 08:26 549 查看
在修改表字段的NUMBER类型的精度或刻度时,你可能会遇到ORA-01440:columntobemodifiedmustbeemptytodecreaseprecisionorscale,下面介绍一下,如何处理这个问题。测试案例如下:

SQL>droptabletest;
Tabledropped.
SQL>createtabletest(product_idnumber,pricenumber(38,1));
Tablecreated.
SQL>insertintotest
2select1001,18.2fromdualunionall
3select1002,38.5fromdualunionall
4select1003,34.8fromdualunionall
5select1004,87.4fromdual;
4rowscreated.
SQL>commit;
Commitcomplete.
SQL>altertabletestmodifypricenumber(38,2);
altertabletestmodifypricenumber(38,2)
*
ERRORatline1:
ORA-01440:columntobemodifiedmustbeemptytodecreaseprecisionorscale
SQL>






如上所示,当我们修改字段price的NUMBEr类型的刻度时,就会遇到ORA-01440:columntobemodifiedmustbeemptytodecreaseprecisionorscale,解决这个问题的方法有两种

方案1:

1:首先对该表做逻辑备份,当然如果你确定没有什么问题,也可以忽略此步骤。作为DBA,一般都应该有强烈的风险意识。

SQL>createtabletest_20170608_bak
2as
3select*fromtest;
Tablecreated.
SQL>


2:增加一个临时字段用来复制旧字段数据

SQL>altertabletestaddprice_tmpnumber(38,1);
Tablealtered.
SQL>updatetestsetprice_tmp=price;
4rowsupdated.
SQL>commit;
Commitcomplete.


3:修改字段price的刻度(Scale)值

SQL>updatetestsetprice=null;
4rowsupdated.
SQL>commit;
Commitcomplete.
SQL>altertabletestmodifypricenumber(38,2);
Tablealtered.


4:将数据从字段price_tmp更新回price字段

SQL>updatetestsetprice=price_tmp;
4rowsupdated.
SQL>commit;
Commitcomplete.
SQL>


5:删除临时字段price_tmp

SQL>altertabletestdropcolumnprice_tmp;
Tablealtered.


方案2:

另外一种方法就是备份数据,然后删除全部数据,然后修改表结构,最后将数据更新回去。如下所示:

1:备份原表数据

SQL>createtabletest_bak
2as
3select*fromtest;
Tablecreated.
SQL>


2:清理删除原表数据

SQL>truncatetabletest;
Tabletruncated.


3:修改表资源的精度或标度

SQL>altertabletestmodifypricenumber(38,3);
Tablealtered.
SQL>


4:将数据还原回去

SQL>insertintotest
2select*fromtest_bak;
4rowscreated.
SQL>commit;
Commitcomplete.
SQL>select*fromtest;
PRODUCT_IDPRICE
--------------------
100118.2
100238.5
100334.8
100487.4
SQL>


另外,需要注意的是,这两者方法都必须确保操作时,没有业务或应用程序操作该表,否则会有数据一致性问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐