3

次の列を持つテーブル Tester を oracle に持っています。

  • テスターID
  • テスター名
  • IsDefault
  • アプリケーションID

TesterID は主キーです。ここで、Default Tester を 1 つだけにする必要があります。つまり、1 つの Tester だけが ApplicationID で IsDefault =Y の値を持つことができます。

私は制約でそれを試しました:

alter table Tester add constraint Tester_ISDEFAULT UNIQUE(IsDefault,Application_ID);

isdefault=Y で一意のキーを作成することは可能ですか?

手伝ってくれてありがとう!

4

4 に答える 4

7

UNIQUE制約はありません。ただし、UNIQUE INDEX代わりに次のものを使用できます。

CREATE UNIQUE INDEX ApplicationId_Default_Y ON tester (
  CASE WHEN IsDefault = 'Y'
       THEN ApplicationId
       ELSE NULL
  END
);

これがデモです。

于 2012-08-29T12:05:17.420 に答える
1

これは、制約自体ではなく、関数ベースの一意のインデックスを使用して行うことができます。

create unique index tester_isdefault on tester 
  (case when isdefault='Y' then application_id end);

Oracle はすべて null のキーのインデックス エントリを作成しないため、isdefault='Y' である行のみがインデックスに表示されます。

于 2012-08-29T12:03:21.300 に答える
0

この制約は、Application_ID ごとに 2 つの行 (IsDefault=0 の行と IsDefault=1 の行) しか持てないことを意味するため、機能しません。

トリガーを使用してこのロジックを適用できます。または、アプリケーション ロジックで強制しないのはなぜですか?

于 2012-08-29T12:02:04.693 に答える
0

tester(decode(is_default, 'Y', 0, tester_id), application_id) に一意のインデックス tester_ui_1 を作成します

于 2012-08-29T12:03:45.997 に答える