您有尾随逗号就在年底,和一个太多闭幕括号:
...84))),);
除非你在发布前切出来的东西,这可能是这种情况作为错误引用第23行(但是希望不是,因为它是棘手的看到在代码中的一个问题,你不能看到在所有)。如果变成你有什么编译:
...84)));
但条件是错误的,无论如何,正如其他人指出。你想要得到的结果,我认为的一种方法是:
...
CONSTRAINT IC4 CHECK (classification != 'junior' OR hours BETWEEN 55 AND 84)
);
的OR意味着当classification为'junior',和任何其他classification不受限制的hours检查仅适用。 (如果您需要针对不同分类的不同规则,请查看the very similar question Chris Saxon链接到评论中)。
随着一些测试数据:
insert into students values (1, 'A', 'junior', 54, 1, 1); -- ORA-02290
insert into students values (2, 'B', 'junior', 55, 1, 1); -- OK
insert into students values (3, 'C', 'junior', 84, 1, 1); -- OK
insert into students values (4, 'D', 'junior', 85, 1, 1); -- ORA-02290
insert into students values (5, 'E', 'senior', 54, 1, 1); -- OK
insert into students values (6, 'F', 'senior', 55, 1, 1); -- OK
insert into students values (7, 'G', 'senior', 84, 1, 1); -- OK
insert into students values (8, 'H', 'senior', 85, 1, 1); -- OK
select * from students order by id;
ID NAME CLASSIFICATION HOURS GPA MENTOR
---- ---------- -------------- ----- --- ------
2 B junior 55 1.00 1
3 C junior 84 1.00 1
5 E senior 54 1.00 1
6 F senior 55 1.00 1
7 G senior 84 1.00 1
8 H senior 85 1.00 1
6 rows selected
BETWEEN是包容性的,所以这是一样的:
CONSTRAINT IC4 CHECK (classification != 'junior' OR (hours >= 55 AND hours <= 84))
您还可能希望在classification检查约束,特别是因为这种约束的情况下现在敏感;或者最好有一个单独的classification表,并对此表中的列有一个外键约束。但这可能超出了你对这项任务的控制。