2011-09-28 44 views
3

我正在使用oracle 10gr2。我試圖強制對名爲「分數」的列進行約束,以便只能輸入分數。將分數約束添加到oracle中的列中

更具體地,格式應包含在分子中一個數字,並在分母一個數位,使得用戶只能輸入一個分數例如3/42/5,或者7/8。該列僅接受數字作爲輸入。任何人都可以看到我使用的SQL嗎?

+0

部分9/8是價值大於1的一小部分 - 合法嗎? 2/4怎麼樣,可以合理化爲1/2? – onedaywhen

回答

0

我沒有甲骨文的一個實例,以測試對,但這裏有一些指針和一些未經測試的代碼

指針:

你可能會使用REGEX_LIKE,它看起來就像是這樣的:

ALTER TABLE your_table 
add CONSTRAINT check_your_field 
    CHECK (REGEXP_LIKE(your_field, '^[0-9]+/[0-9]+$')); 

警告:這不能保證是全功能的代碼。這是領先的。相應地閱讀,研究和調整。

一個警告:1/0將由上述正則表達式被認爲是有效的,但我們都知道它不應該是。有一種方法可以知道分數的第二部分。閱讀正則表達式鏈接,你需要知道的一切都在那裏。

8

如果我理解正確,我認爲正確的方法是將數據存儲在兩列中。如果最上面的數字是用戶對問題的實際得分,而底部的數字是可能的得分,這就是特別有意義的,這就是您聽起來像是在做的事情。這將使您能夠使用Oracle中的內置數字函數來總結分數,而不是解析字符串。然後,使用NUMBER(1,0)類型將每列的大小限制爲(0-9)。例如:

alter table table_name add (
    column possible number(1,0), 
    column actual number(1,0) 
); 

如果在得分列有數據已,你再用從那裏複製你的價值觀到新列。最後,你放下那一欄。

alter table table_name drop score; 

另外,我會做的「甲骨文小於約束」的搜索,因爲你可能不希望實際得分超過可能的,恐怕也是一個類似的約束,以使可能的得分更高比零。

+1

這比嘗試將小數值作爲字符串存儲要好得多。 – Allan

+1

這是正確的方法,因爲它確定有兩項信​​息要存儲,而不僅僅是一項。 – MatBailie

+1

*「因爲您可能不希望實際分數超過可能的」*無論發生額外信貸的情況如何? – NullUserException

0

有效值的域有限且很小。因此,考慮使用固定寬度的文本列(即三個字符)並將它們全部放在一個表中,並創建對該查找表的外部引用,而不是CHECK約束。