Oracle主键:NUMBER与NUMBER(7,0)

指定PK的精度有什么好处吗?鉴于可能永远不会超过几千条记录,7,0是否足够?

没有指定精度的危险吗?

NUMBER(7,0)只限制了值的域.

他们的内部表现没有区别:

CREATE TABLE t_pk (col1 NUMBER(7,0) NOT NULL,col2 NUMBER(38) NOT NULL)

INSERT
INTO    t_pk
VALUES  (9999999,9999999)

SELECT  DUMP(col1),DUMP(col2)
FROM    t_pk

DUMP(col1)                        DUMP(col2)
---                               ---
Typ=2 Len=5: 196,10,100,100   Typ=2 Len=5: 196,100

在Oracle中,NUMBER存储为归一化为0.01 <= N <1的数值的十进制数字. 1并以指数为前缀. 在上面的例子中:
> 196是基于192的指数(4).
> 10是十进制9
> 100是十进制99

整数以十进制读数00.09 99 99 99 *(100 ^ 4)= 9,999,999

满足所请求精度所需的位数越多,当然会存储的数字越多.

当您将精确值插入精度较低的列时,它只会舍入到列的精度并存储为圆形.

因此,声明列NUMBER(38)在性能上是安全的,因为它意味着没有超过NUMBER(7,0)的开销(对于适合两种类型的数字).

但是,如果您的PRIMARY KEY本质上是整数,则最好将精度指定为0,以确保没有小数值到达您的表.

更新:

@Mac还指出客户端可能依赖列数据类型来计算值域.

如果您的应用程序需要INT32,您应该使您的号码为NUMBER(9)或更低(或您的客户认为可转换为Int32的任何类型).

相关文章

数据库版本:11.2.0.4 RAC(1)问题现象从EM里面可以看到,在23号早上8:45~8:55时,数据库等待会话暴增...
(一)问题背景最近在对一个大约200万行数据的表查看执行计划时,发现存在异常,理论上应该返回100多万...
(一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RM...
(1)DRA介绍 数据恢复顾问(Data Recovery Advise)是一个诊断和修复数据库的工具,DRA能够修复数据文...
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup)、修复(restore)和恢复...
(1)备份对象 可以使用RMAN进行的备份对象如下: --整个数据库:备份所有的数据文件和控制文件; --数...