2013-02-03 97 views
1

我想在Oracle中制定一个由几个完整性约束条件控制的表。该表由一个假设的学生数据库组成。数据库的规则之一是,要将学生归类为初级,他们必须完成55至84学分(含)。Oracle检查完整性约束

我需要创建一个完整性约束来执行此规则,但我不完全确定如何去做。我有一种感觉,CHECK约束在这种情况下会很有用。

到目前为止,我有...

CONSTRAINT IC4 CHECK (hours >=55 AND hours <= 84), 

此代码是有效的,但是它并没有确定是否该学生的记录是三年级了。

我的表的建立是...

CREATE TABLE Students (id    INTEGER, 
          name    CHAR(10) NOT NULL, 
          classification CHAR(10) NOT NULL, 
          hours    INTEGER, 
          gpa    NUMBER(3,2) NOT NULL, 
          mentor   INTEGER); 

因此,如果我们试图插入...

INSERT INTO Students VALUES (50, 'Kim', 'junior', 34, 3.5, 40); 

...完整性约束将被侵犯,因为该记录是试图存储为“初级”,但学生只完成了34个小时。

我该如何去写一个强制执行这些规则的约束?

回答

4

您需要再次使用魔语and

CREATE TABLE students (
.... 
, CONSTRAINT IC4 CHECK (classification = 'junior' AND hours >=55 AND hours <= 84) 

我怀疑你会希望有其他的分类太,并验证其范围。使用括号和OR来做到这一点。 (并使用BETWEEN来清晰地定义范围)...

, CONSTRAINT IC4 CHECK ((classification = 'junior' AND hours BETWEEN 55 AND 84) 
         OR (classification = 'sophomore' AND hours BETWEEN 85 AND 124) 
         OR (classification = 'senior' AND hours > 124) 
         OR (classification = 'fresher') 
         )         

确保您有一组完整的范围。

1

一旦你创建表:

使用下面给出的ALTER语句然后添加检查约束:

ALTER TABLE Students 
ADD CONSTRAINT IC4 (classification='junior' AND hours >=55 AND hours <= 84); 

现在,当您尝试插入下面的语句:

INSERT INTO Students VALUES (50, 'Kim', 'junior', 34, 3.5, 40); 

它将不允许插入上述声明。