我想知道是否有办法阻止数字类型的数据进入表中,如果该数字的值不是整数。防止小数进入一列 - Oracle
即。如果数据包含小数或小数,我不想存储数据。我正在使用oracle 11g。尽管将比例定义为0,oracle会将数字的小数部分舍入为最接近的整数。
很确定我们必须在列上有某种检查约束,但我不太确定那会是什么。
任何帮助将不胜感激。谢谢!
我想知道是否有办法阻止数字类型的数据进入表中,如果该数字的值不是整数。防止小数进入一列 - Oracle
即。如果数据包含小数或小数,我不想存储数据。我正在使用oracle 11g。尽管将比例定义为0,oracle会将数字的小数部分舍入为最接近的整数。
很确定我们必须在列上有某种检查约束,但我不太确定那会是什么。
任何帮助将不胜感激。谢谢!
对于较小的分数,也许使用浮点数?
(因为加规模的数量只是工作的定义的范围)
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.
谢谢你指出。这一次,我的类型设置为NUMBER(2,0)。 – Blurryface
它适用于大多数情况,但它仍然允许超出比例的值并接近上限或下限整数值。对于比例尺2,如果我们给出12.9999或10.0001,它会接受这些值而不会出错。 有没有解决这个问题的方法? – Blurryface
我最初尝试过这种方式,自己有点困惑。它只是自动截断以适应,检查是无用的。现在我看到你正在发现更小分数的问题。如果有必要,你可以有一个触发器检查这个和raise_application_error,但必须有一个更优雅的解决方案。 – Scott
您可以使用check
约束:
alter table t add constraint chk_col_int as (col = trunc(col));
但是,它可能会更有意义,只是声明列整数或不带小数位的数值。嗯,这可能不会做你想要的,因为输入的实数/浮点数将被转换而不是产生错误。
准确地说,我的观点。它被存储为整数而不是抛出错误。 – Blurryface
上面的检查约束似乎没有多大帮助。它仍然存储数字的整数部分。 – Blurryface
'alter table t add constraint chk_col_int as(ceil(col)= floor(col))enable;' – kfinity
有没有什么建议可以使用一个整数类型? – Carcigenicate
是的,我确实尝试过。 Oracle似乎也将整数类型的值舍入为整数类型的最接近的整数。 – Blurryface