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

栏目: 数据库 · 发布时间: 8年前

内容简介:ORA-01440: column to be modified must be empty to decrease precision or scale

在修改表字段的NUMBER类型的精度或刻度时,你可能会遇到ORA-01440: column to be modified must be empty to decrease precision or scale,下面介绍一下,如何处理这个问题。测试案例如下:

SQL> drop table test;
 
 
 
Table dropped.
 
 
 
SQL>create table test(product_id  number,  price number(38,1));
 
 
 
Table created.
 
 
 
SQL> insert into test
 
  2  select 1001, 18.2 from dual union all
 
  3  select 1002, 38.5 from dual union all
 
  4  select 1003, 34.8 from dual union all
 
  5  select 1004, 87.4 from dual;
 
 
 
4 rows created.
 
 
 
SQL> commit;
 
 
 
Commit complete.
 
 
 
SQL> alter table test modify price number(38,2);
 
alter table test modify price number(38,2)
 
                        *
 
ERROR at line 1:
 
ORA-01440: column to be modified must be empty to decrease precision or scale
 
 
 
 
 
SQL>

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

如上所示,当我们修改字段price的NUMBEr类型的刻度时,就会遇到ORA-01440: column to be modified must be empty to decrease precision or scale,解决这个问题的方法有两种

方案1:

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

SQL> create table test_20170608_bak
  2  as
  3  select * from test;
 
Table created.
 
SQL> 

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

SQL> alter table test add price_tmp number(38,1);
 
Table altered.
 
SQL> update test set price_tmp = price;
 
4 rows updated.
 
SQL> commit;
 
Commit complete.

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

SQL> update test set price = null;
 
4 rows updated.
 
SQL> commit;
 
Commit complete.
 
SQL> alter table test modify price number(38,2); 
 
Table altered.

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

SQL> update test set price = price_tmp;
 
4 rows updated.
 
SQL> commit;
 
Commit complete.
 
SQL> 

5:删除临时字段price_tmp

SQL> alter table test drop column price_tmp;
 
Table altered.

方案2:

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

1:备份原表数据

SQL> create table test_bak
  2  as
  3  select * from test;
 
Table created.
 
SQL>

2:清理删除原表数据

SQL> truncate table test;
 
Table truncated.

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

SQL> alter table test modify price number(38,3);
 
Table altered.
 
SQL> 

4:将数据还原回去

SQL> insert into test
  2  select * from test_bak;
 
4 rows created.
 
SQL> commit;
 
Commit complete.
 
SQL> select * from test;
 
PRODUCT_ID      PRICE
---------- ----------
      1001       18.2
      1002       38.5
      1003       34.8
      1004       87.4
 
SQL> 

另外,需要注意的是,这两者方法都必须确保操作时,没有业务或应用程序操作该表,否则会有数据一致性问题。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java Concurrency in Practice

Java Concurrency in Practice

Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer、David Holmes、Doug Lea / Addison-Wesley Professional / 2006-5-19 / USD 59.99

This book covers: Basic concepts of concurrency and thread safety Techniques for building and composing thread-safe classes Using the concurrency building blocks in java.util.concurrent Pe......一起来看看 《Java Concurrency in Practice》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具