SQL:Check Constraint / Sequence中的麻烦

时间:2013-04-18 07:55:06

标签: sql oracle sequence check-constraints

所以我创建了一个名为“考试”的表,其中有三列“名称”,“Rollno”和“结果P / F”。我希望它能够做到以下几点:

当输入名称时(通过'& name'语法),它会自动为第一个名称指定卷号(Rollno)1501然后要求您输入结果,您只能输入“P”或“F”,分别为合格或不合格。当您输入下一个名称时,它会将Rollno增加到1502 ..依此类推。

关于Rollno部分,我有一个名为EXAMSQN的序列。看起来像: The first one

关于“结果P / F”部分,我有一个检查约束。这就是我如何在表中插入值:

insert into exam (name, rollno, "Result P/F")
values ('&name', examsqn.nextval, '&Result P/F')

顺便说一下,这就是我的检查约束:

1  alter table exam
2* add constraint exam_result_ck check ("Result P/F" in ('P','F'))

所以我对此的期望是它只需要P或F,当它要求结果时

我被问到名字和结果,但是在我得到错误之后。这就是整个过程:

Enter value for name: nikh
Enter value for result: P
old   2: values ('&name', examsqn.nextval, '&Result P/F')
new   2: values ('nikh', examsqn.nextval, 'P P/F')
insert into exam (name, rollno, "Result P/F")
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.EXAM_RESULT_CK) violated

非常感谢您的帮助。

谢谢:)

2 个答案:

答案 0 :(得分:1)

输出清楚地显示替代值:

new   2: values ('nikh', examsqn.nextval, 'P P/F')

显然'P P/F' != 'P' and 'P P/F' != 'F'。因此检查约束投掷。

这是因为变量名称中的空格。我建议您使用下划线:&Result_PF。或者只是称之为result

如果您想告诉用户您需要使用SQL * Plus提示符的有效值:

accept result_pf prompt "Please enter a value for Result (P/F): "

答案 1 :(得分:1)

要让它发挥作用,您只需从'&结果P / F'中删除'P / F'

你可以从它试图插入'P P / F'的旧的新输出中看到这个,这就是你的约束失败的原因。

另外,最好不要将您的专栏“结果P / F”调用,而是使用别名。

干杯