admin

在Oracle中更改数字列的精度

sql

目前,我有一列被声明为NUMBER。我想将列的精度更改为NUMBER(14,2)。

所以,我跑了命令

 alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)'

为此,我遇到了一个错误:

   column to be modified must be empty to decrease precision or scale

我猜想它在更改精度时希望该列为空,但我不知道为什么要在增加它的同时降低它,所以列中的数据不会丢失。有一个简短的解决方法吗?我不想将其复制到另一个表中,然后再删除它,或者重命名一列并在各列之间进行复制,因为存在传输和删除之间丢失数据的风险。


阅读 270

收藏
2021-05-10

共1个答案

admin

假设您最初没有设置精度,则假定为最大值(38)。您正在降低精度,因为您将精度从38更改为14。

解决此问题的最简单方法是重命名该列,将数据复制过来,然后删除原始列:

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD;

alter table EVAPP_FEES add AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_OLD;

alter table EVAPP_FEES drop column AMOUNT_OLD;

如果您确实要保留列顺序,则可以将数据移动两次:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;

update EVAPP_FEES set AMOUNT = null;

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;

alter table EVAPP_FEES drop column AMOUNT_TEMP;
2021-05-10