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

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

内容简介: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> 

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


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

查看所有标签

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

深度探索C++对象模型(影印版)

深度探索C++对象模型(影印版)

Stanley B. Lippman / 中国电力出版社 / 2003-8-1 / 42.00

本书重点介绍了C++面向对象程序设计的底层机制,包括结构式语意、暂时性对象的生成、封装、继承和虚拟——虚拟函数和虚拟继承。书中向你表明:理解底层实现模型,可以极大地提高你的编码效率。Lippman澄清了那些关于C++系统开销与复杂性的各种错误信息和猜测,指出了其中某些成本和利益交换确实存在。他在书中详述了各种实现模型,指出了它们的发展方向以及促使其发展的根本原因。本书涵盖了C++对象模型的语意暗示......一起来看看 《深度探索C++对象模型(影印版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换