0

複雑なチェック制約を持つことは可能ですか?

たとえば、各レコードに顧客タイプが割り当てられている顧客テーブルがあります。

したがって、同じタイプの顧客が複数いる可能性があります。

タイプごとに 1 人の顧客をそのタイプの「プライマリ」アカウントに設定したいのですが、タイプごとに 1 人の顧客しかプライマリにできません。

IsPrimary フィールドにチェック制約を追加して、同じタイプのすべての顧客をチェックして、プライマリとしてマークされた顧客がすでに存在するかどうかを確認することはできますか?

これは明らかに C# コードで実行できますが、これは追加のチェックとして行いたいと思います。

トリガーを使用することもできますが、すべてのエラーに対して同じ方法でエラーを処理できるように、制約に固執したいと考えています。

ありがとう

4

1 に答える 1

4

これは正確にはチェック制約の問題ではありません。これは、フィルター処理された一意のインデックスの問題です。

create unique index customers_type_isprimary on customers(type)
    where isPrimary = 1;

isPrimaryこれにより、多くても 1 人の顧客が各タイプにフラグを設定することが保証されます。

編集:

フィルター選択されたインデックスは興味深い作成です。ドキュメントに加えて、それらを説明するさまざまなリソース (この など)があります。

whereアイデアは、インデックス作成ステップで句に一致する行にのみインデックスを構築することです。これを行う理由の 1 つは、インデックスのサイズを小さくすることです。

これは、データ構造の使用例です。でフィルタリングするクエリが多数ある場合がありますisPrimary = 1。フィルタリングすることはありません。これを句isPrimary = 0から除外するだけです。where不要な値でインデックスを乱雑にするのはなぜですか? 述語がクエリ内にある場合は、インデックスを使用できます。

インデックスの場合は、uniqueより説得力があります。フィルタリングされた一意のインデックスは、あなたが求めていることを正確に行います-IsPrimary各タイプに最大1つの値が設定されるようにします。これは、設定typeした顧客に対してのみインデックスを作成することによって行わIsPrimaryれます。インデックスの「一意」の部分は、各タイプがインデックスに 1 回だけ表示されることを保証し、拡張により、1 つの顧客のみがIsPrimarytype.

于 2014-02-25T14:41:59.247 に答える