我想知道是否有辦法阻止數字類型的數據進入表中,如果該數字的值不是整數。防止小數進入一列 - 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