1

別のフィールドが特定の値である場合にフィールドが NULL になる可能性があり、それ以外の場合は NOT NULL である必要があるという状況があります。

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

2 つの制約を作成しました。1 つ目は、「Type」に特定の値のみを入力できるようにするものです。

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

もう 1 つの制約 (エラーが発生し、右括弧が欠落している) は、"Type" が特定の型の場合、BestandLocatie が NOT NULL であることを確認する必要があります。

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

Where 句を検索したところ、select ステートメントでしか例が見つかりませんでした。これは、ここでは使用できないことを意味しますか、これを行う他の方法はありますか、それとも最終アプリケーションでこれを確認する必要がありますか、それとも PLSQL でのみ行うことができますか?

4

1 に答える 1

3

You can do something like this:

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 */)
        )
);

The commented and b is null should be there depending on whether you want to require the value to be null in the other cases or not.

Demo:

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 に答える