1

我有一种情况,当另一个字段是某些值时,一个字段可以为 NULL,而对于其他字段,它应该为 NOT NULL。

"Type"              VARCHAR2(30)      NOT NULL,
BestandLocatie      VARCHAR2(150)     NULL,

我做了两个约束,第一个确保只能输入“类型”中的某些值。

CONSTRAINT TypeCheck
          CHECK ("Type" IN ('Tab', 'Bass Tab', 'Chords', 'Power Tab', 'Guitar Pro', 
                    'Video Lesson', 'Drum Tab', 'Ukulele Chords')),

另一个约束(给出错误,缺少右括号)应确保当“类型”是某些类型时 BestandLocate 不为空:

CONSTRAINT BestandLocatieCheck 
    CHECK (BestandLocatie IS NOT NULL WHERE ("Type" IN ('Power Tab', 'Guitar Pro'
                            'Video Lesson')))

当我搜索 Where 子句时,我只在 select 语句中找到了它的示例。这是否意味着我不能在这里使用它,是否有其他方法可以做到这一点,或者我必须在最终应用程序中检查它还是只能在 PLSQL 中完成?

4

1 回答 1

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
于 2014-10-19T13:27:28.860 回答