我正在使用oracle 10gr2。我試圖強制對名爲「分數」的列進行約束,以便只能輸入分數。將分數約束添加到oracle中的列中
更具體地,格式應包含在分子中一個數字,並在分母一個數位,使得用戶只能輸入一個分數例如3/4
,2/5
,或者7/8
。該列僅接受數字作爲輸入。任何人都可以看到我使用的SQL嗎?
我正在使用oracle 10gr2。我試圖強制對名爲「分數」的列進行約束,以便只能輸入分數。將分數約束添加到oracle中的列中
更具體地,格式應包含在分子中一個數字,並在分母一個數位,使得用戶只能輸入一個分數例如3/4
,2/5
,或者7/8
。該列僅接受數字作爲輸入。任何人都可以看到我使用的SQL嗎?
我沒有甲骨文的一個實例,以測試對,但這裏有一些指針和一些未經測試的代碼:
指針:
你可能會使用REGEX_LIKE
,它看起來就像是這樣的:
ALTER TABLE your_table
add CONSTRAINT check_your_field
CHECK (REGEXP_LIKE(your_field, '^[0-9]+/[0-9]+$'));
警告:這不能保證是全功能的代碼。這是領先的。相應地閱讀,研究和調整。
一個警告:1/0
將由上述正則表達式被認爲是有效的,但我們都知道它不應該是。有一種方法可以知道分數的第二部分。閱讀正則表達式鏈接,你需要知道的一切都在那裏。
如果我理解正確,我認爲正確的方法是將數據存儲在兩列中。如果最上面的數字是用戶對問題的實際得分,而底部的數字是可能的得分,這就是特別有意義的,這就是您聽起來像是在做的事情。這將使您能夠使用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;
另外,我會做的「甲骨文小於約束」的搜索,因爲你可能不希望實際得分超過可能的,恐怕也是一個類似的約束,以使可能的得分更高比零。
這比嘗試將小數值作爲字符串存儲要好得多。 – Allan
這是正確的方法,因爲它確定有兩項信息要存儲,而不僅僅是一項。 – MatBailie
*「因爲您可能不希望實際分數超過可能的」*無論發生額外信貸的情況如何? – NullUserException
有效值的域有限且很小。因此,考慮使用固定寬度的文本列(即三個字符)並將它們全部放在一個表中,並創建對該查找表的外部引用,而不是CHECK
約束。
部分9/8是價值大於1的一小部分 - 合法嗎? 2/4怎麼樣,可以合理化爲1/2? – onedaywhen