2017-08-16 58 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