我有一种情况,当另一个字段是特定值时,字段可以为NULL,而对于其他字段,它应该是非NULL。
"Type" VARCHAR2(30) NOT NULL,
BestandLocatie VARCHAR2(150) NULL,
我做了两个约束,第一个约束确保只有" Type"中的某些值。可以输入。
CONSTRAINT TypeCheck
CHECK ("Type" IN ('Tab', 'Bass Tab', 'Chords', 'Power Tab', 'Guitar Pro',
'Video Lesson', 'Drum Tab', 'Ukulele Chords')),
另一个约束(给出错误,缺少右括号)应该确保当" Type"时,BestandLocatie不为NULL。是某些类型:
CONSTRAINT BestandLocatieCheck
CHECK (BestandLocatie IS NOT NULL WHERE ("Type" IN ('Power Tab', 'Guitar Pro'
'Video Lesson')))
当我搜索Where子句时,我只在select语句中找到了它的例子。这是否意味着我不能在这里使用它,是否有其他方法可以执行此操作,或者我必须在最终应用程序中检查它还是只能在PLSQL中完成?
答案 0 :(得分:3)
您可以这样做:
alter table foo add (constraint check_b
check ( (a in ('a', 'b') and b is not null)
or (a not in ('a', 'b') /* and b is null */)
)
);
评论and b is null
应该在那里,具体取决于您是否要求在其他情况下该值为空。
演示:
SQL> create table foo (a varchar(2) not null, b varchar(2));
SQL> alter table foo add (constraint check_b check (
(a in ('a', 'b') and b is not null) or (a not in ('a', 'b') and b is null))
);
Table altered.
SQL> insert into foo values ('a', 'b');
1 row created.
SQL> insert into foo values ('a', null);
insert into foo values ('a', null)
*
ERROR at line 1:
ORA-02290: check constraint (MAT.CHECK_B) violated
SQL> insert into foo values ('c', null);
1 row created.
SQL> insert into foo values ('c', 'b');
insert into foo values ('c', 'b')
*
ERROR at line 1:
ORA-02290: check constraint (MAT.CHECK_B) violated