将分数约束添加到oracle中的列

时间:2011-09-28 14:49:28

标签: sql oracle constraints

我正在使用oracle 10gr2。我试图对名为“得分”的列强制执行约束,以便只能输入分数。

更具体地说,格式应该在分子中包含一个数字,在分母中包含一个数字,这样用户只能输入一个分数,例如3/42/5或{{1 }}。该列仅接受数字作为输入。谁能告诉我使用的SQL?

3 个答案:

答案 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;

另外,我会搜索“Oracle小于约束”,因为你可能不希望实际分数超过可能的分数,并且可能会做一个类似的约束来使得可能得分大于零。< / p>

答案 1 :(得分:0)

我没有要测试的Oracle实例,但这里有一些指针和一些未经测试的代码

指针:

您可能会使用REGEX_LIKE,它看起来像这样:

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

警告:不保证这是完全正常运行的代码。这是一个领先者。阅读,研究并相应调整。

警告:1/0将被上述正则表达式视为有效,但我们都知道它不应该是。有一种方法可以让你知道分数的第二部分。阅读Regex链接,您需要知道的一切都在那里。

答案 2 :(得分:0)

有效值的域是有限且小的。因此,请考虑将它们全部放在表中,使用固定宽度的文本列(即三个字符)并创建对此查找表的外部引用,而不是CHECK约束。