0

次の Categories テーブルがあるとします。

Category  MinValue  MaxValue
A         1         2
B         3         9
C         10        0

上記では、最大値がないことを示すために 0 を使用しています。これらの値は、エンド ユーザーが構成できます。カテゴリを追加および削除し、最大値と最小値を変更できます。2 つの範囲が重複しないようにするために、テーブルに設定できる何らかの制約はありますか?

このテーブルは Web アプリケーションを使用して変更されるため、Javascript を使用してテーブルへの変更を事前に検証できるため、重複を防ぐアルゴリズムでも十分です。

4

2 に答える 2

1

ここで明らかなことを見逃しているのかもしれませんが、Oracle ではこれは簡単ではないと思います。

マテリアライズド ビューを使用したソリューションを見てきました

  • カテゴリ テーブルからの重複を含む
  • コミット時に更新されます
  • 行を含まないというチェック制約があります。これは、マテリアライズド ビューに「rownum」列を設定し、この「rownum」列の値が常に 0 になるようにチェック制約を設定することで実現できます。

ユーザーが重複するデータを入力すると、コミット時にマテリアライズドのチェック制約に違反します。

コミット時にOracleが例外を発生させ、ユーザーに適切なメッセージを表示できるように、フロントエンドを作成する必要があります。

たとえば、Postgresql の最新バージョンでは、これは除外制約によって非常に簡単です。

于 2012-10-18T09:54:41.133 に答える
0

制約でできるとは思いませんが、before insert/updateトリガーを作成しraise_application_error、条件に違反した場合に挿入を中止するために使用できるはずです。

何かのようなもの...

if exists (select * from yourtable where :new.minvalue<maxvalue and :new.maxvalue>minvalue)
begin
   raise_application_error(...)
end
于 2012-10-18T10:01:03.780 に答える