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