chr*_*ris 7 oracle primary-key
指定PK的精度有什么好处吗?鉴于可能永远不会超过几千条记录,7,0是否足够?
没有指定精度的危险吗?
Qua*_*noi 10
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,100 Typ=2 Len=5: 196,10,100,100,100
Run Code Online (Sandbox Code Playgroud)
在Oracle,中,NUMBERs被存储为归一化0.01 <= N < 1并以指数为前缀的数值的十进制数字.
在上面的例子中:
196是192基于指数的(4).10 是小数 9100小数是十进制99的整数以十进制读取 00.09 99 99 99 * (100 ^ 4) = 9,999,999
满足所请求精度所需的位数越多,当然将存储的数量越多.
当您将精确值插入精度较低的列时,它只会舍入到列的精度并存储为圆形.
因此,声明列是安全的性能NUMBER(38),因为它意味着没有开销NUMBER(7, 0)(对于适合两种类型的数字).
但是,如果您的PRIMARY KEYs本质上是整数,则最好指定精度,0以确保没有小数值到达您的表.
更新:
@Mac还指出客户端可能依赖列数据类型来计算值域.
如果您的申请需要INT32,您应该将您的号码NUMBER(9)设为a 或更低(或您的客户认为可转换为的任何类型Int32).