2

ID ごとに正確に 1 行が特定の列に特定の値を持つように、テーブルに何かを追加したい (トリガー?)。そのため、これが当てはまらないステートメントが実行された場合、例外がスローされ、挿入がロールバックされます。

このスキーマを見てみましょう。

ID    Current    Value
1     Y          0
1     N          0
1     N          2
2     Y          2

そして、私が望む制約は、IDごとに、正確に1つの行に現在の「Y」があるということです。

したがって、これらのステートメントは実行されず、適切なエラーが返されます。

insert into table values (1,'Y',1);
insert into table values (3,'N',2);
update table set current = 'N' where ID = 1;

2 つの質問があります。

  1. この種の制約ロジックをテーブルにコーディングするのは良い考えですか、それともデータを操作するアプリケーション用に保存するのが最適ですか? なんで?

  2. どうすればそれができますか?このような制約を作成するためにオラクルはどのようなツールを提供していますか?

4

2 に答える 2

2

(トリガーを使用するなどの手続き的な方法ではなく)宣言的な方法で指定できる場合に最適です。特に、ある種のロックアルゴリズムがないと、同時セッションが同時にテーブルを挿入/更新しようとするため、トリガーは機能しません。

この場合、最も単純なソリューションは、一意の関数ベースのインデックスです。例:

CREATE UNIQUE INDEX only_one_current ON thetable
  (CASE WHEN Current = 'Y' THEN ID END);

Current ='N'の場合、式はNULLであり、インデックス内のすべてのNULL行は格納されません。つまり、一意性制約は、Current='Y'の行にのみ適用されます。

于 2012-09-06T04:49:46.850 に答える