更改Oracle中数字列的精度

时间:2012-02-10 19:49:58

标签: sql oracle precision

目前我有一个声明为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

我猜它希望列变为空而它改变了精度,我不知道为什么它说我们想要减少它而我们增加它,列中的数据不会丢失。这有一个简短的解决方法吗?我不想将其复制到另一个表中并在之后删除它,或者重命名列并在列之间复制,因为在传输和丢弃之间存在丢失数据的风险。

3 个答案:

答案 0 :(得分:72)

假设您最初没有设置精度,则假设它是最大值(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;

答案 1 :(得分:1)

通过设置比例,可以降低精度。尝试NUMBER(16,2)。

答案 2 :(得分:1)

如果表被压缩,这将起作用:

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 move nocompress;

alter table EVAPP_FEES drop column AMOUNT_TEMP;

alter table EVAPP_FEES compress;