2017-08-16 60 views
1

我想知道是否有办法阻止数字类型的数据进入表中,如果该数字的值不是整数。防止小数进入一列 - Oracle

即。如果数据包含小数或小数,我不想存储数据。我正在使用oracle 11g。尽管将比例定义为0,oracle会将数字的小数部分舍入为最接近的整数。

很确定我们必须在列上有某种检查约束,但我不太确定那会是什么。

任何帮助将不胜感激。谢谢!

+0

有没有什么建议可以使用一个整数类型? – Carcigenicate

+0

是的,我确实尝试过。 Oracle似乎也将整数类型的值舍入为整数类型的最接近的整数。 – Blurryface

回答

2

对于较小的分数,也许使用浮点数?

(因为加规模的数量只是工作的定义的范围)

drop table whole_numbers; 
create table whole_numbers(a float); 
alter table whole_numbers add constraint check_whole check (a = trunc(a)); 

insert into whole_numbers values(1); 

1 row inserted. 

insert into whole_numbers values(1.00002); 

ORA-02290: check constraint (VBSMASTER.CHECK_WHOLE) violated 
*Cause: The values being inserted do not satisfy the named check 

*Action: do not insert values that violate the constraint. 
+0

谢谢你指出。这一次,我的类型设置为NUMBER(2,0)。 – Blurryface

+0

它适用于大多数情况,但它仍然允许超出比例的值并接近上限或下限整数值。对于比例尺2,如果我们给出12.9999或10.0001,它会接受这些值而不会出错。 有没有解决这个问题的方法? – Blurryface

+1

我最初尝试过这种方式,自己有点困惑。它只是自动截断以适应,检查是无用的。现在我看到你正在发现更小分数的问题。如果有必要,你可以有一个触发器检查这个和raise_application_error,但必须有一个更优雅的解决方案。 – Scott

1

您可以使用check约束:

alter table t add constraint chk_col_int as (col = trunc(col)); 

但是,它可能会更有意义,只是声明列整数或不带小数位的数值。嗯,这可能不会做你想要的,因为输入的实数/浮点数将被转换而不是产生错误。

+0

准确地说,我的观点。它被存储为整数而不是抛出错误。 – Blurryface

+0

上面的检查约束似乎没有多大帮助。它仍然存储数字的整数部分。 – Blurryface

+0

'alter table t add constraint chk_col_int as(ceil(col)= floor(col))enable;' – kfinity