ORA-01440: column to be modified must be empty to decrease precision or scale
2017-06-08 08:26 潇湘隐者 阅读(7321) 评论(0) 编辑 收藏 举报在修改表字段的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>
如上所示,当我们修改字段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>
另外,需要注意的是,这两者方法都必须确保操作时,没有业务或应用程序操作该表,否则会有数据一致性问题。

· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2016-06-08 Oracle global database name与db link的纠缠关系
2015-06-08 Linux安装DBI/DBD-ORACLE
2014-06-08 [翻译]——SQL Server使用链接服务器的5个性能杀手