Oracle Alter table修改列与乘法值查询

Oracle Alter table修改列与乘法值查询,oracle,alter,Oracle,Alter,我的应用程序与Oracle数据库交互,其中一个表有一百万条记录。问题是: 在该表中,我们有一列用于数字整数类型。我们希望存储浮点值(2位)。我们可以通过乘以100(来自应用程序)来实现这一点,并将它们存储在该列中或修改列数据类型。问题是: 什么需要更少的时间? alter table modify列或查询(update table set column=100*val)。您将无法修改现有列的数据类型: ORA-01439:要更改数据类型,要修改的列必须为空 因此,如果您想拥有浮点列,您需要创建一

我的应用程序与Oracle数据库交互,其中一个表有一百万条记录。问题是:

在该表中,我们有一列用于数字整数类型。我们希望存储浮点值(2位)。我们可以通过乘以100(来自应用程序)来实现这一点,并将它们存储在该列中或修改列数据类型。问题是:

什么需要更少的时间?
alter table modify列或查询(update table set column=100*val)。

您将无法修改现有列的数据类型:

ORA-01439:要更改数据类型,要修改的列必须为空

因此,如果您想拥有浮点列,您需要创建一个浮点列,用整型列的数据更新它,然后删除整型列。DDL很快,但是更新1M行需要时间。您可能希望将其限制为50000行,并在每次更新后提交,这样会更快:

更新MyTable SET NewFloatField=OldINtegerField,其中NewFloatField为NULL且rownum<50000


您可以使用另一种方法更改应用程序中的SQL,在插入数据时乘以100,在检索数据时除以100。但是,我会修改数据库,使数据来自一个来源,而无需在插入或读取数据的所有位置进行解释。

Oracle中的编号没有固有的“格式”,即其内部表示形式不取决于其精度或比例。例如,如果将
编号
123456声明为
编号(9,2)
整数
,则该编号将以相同的方式在内部表示:

SQL> SELECT dump(CAST(123456 AS INTEGER)) int,
  2         dump(CAST(123456 AS NUMBER(9,2))) num
  3    FROM dual;

INT                       NUM
------------------------- --------------------
Typ=2 Len=4: 195,13,35,57 Typ=2 Len=4: 195,13,35,57                    
整数(7)
数字(9,2)
在列中的唯一区别在于
整数(7)
具有更强的检查约束。这两列将以完全相同的方式在内部表示数据

这就是为什么可以毫无问题地提高非空列的列的精度,并且
ALTER TABLE
只会修改元数据(字典表),因此应该是即时的,几乎不需要重做

SQL> create table test (id number(7));

Table created.

SQL> insert into test values (123456);

1 row created.

SQL> alter table test modify (id number(9,2));

Table altered.

SQL> select * from test;

        ID
----------
    123456

我不同意,只要提高列的精度,就可以修改列。从编号(9)到编号(11,2)始终是可能的。它在逻辑上相当于从
VARCHAR2(9)
VARCHAR2(11)