ホームページ > データベース > mysql チュートリアル > NULL を許可する SQL Server 列に一意の制約を効率的に適用するにはどうすればよいですか?

NULL を許可する SQL Server 列に一意の制約を効率的に適用するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-04 09:11:36
オリジナル
614 人が閲覧しました

How Can I Efficiently Enforce Unique Constraints on SQL Server Columns Allowing NULLs?

Null 列の一意の制約のための特殊なインデックス作成

SQL Server データベース管理では、列に対する一意のインデックスの作成に関して疑問が生じます。 NULL 値を許可します。従来の方法では、多くの場合、NULL に対応しながら一意性を強制するフィルターを使用してビューを作成します。ただし、別のアプローチにより、より効率的なソリューションが提供されます。

選択的な一意性制約を適用するためのフィルター インデックス

SQL Server 2008 以降のバージョンでは、一意のフィルター インデックスを作成できるようにするフィルター インデックスが導入されました。データの特定のサブセットに対するインデックス。この機能は、NULL 値を許可する列の一意制約を処理する場合に特に役立ちます。

NULL が許可される列の一意制約のフィルタリングされたインデックスを作成するには、次の構文に従います。

CREATE UNIQUE INDEX AK_MyTable_Column1 ON MyTable (Column1) WHERE Column1 IS NOT NULL;
ログイン後にコピー

インデックス定義の WHERE 句は、一意性制約の範囲を列内の NULL 以外の値のみに制限します。これにより、テーブル内に NULL 値が存在することを許可しながら、一意性が確実に適用されます。

トリガーベースの一意性チェック

代替方法には、データを挿入または更新する前にテーブルの一意性をチェックします。このトリガーは、一意性制約を維持しながら、重複する一意の値が挿入されていないことを検証できます。

次のトリガーの例を使用できます。

CREATE TRIGGER TR_MyTable_Unique
ON MyTable
FOR INSERT, UPDATE
AS
BEGIN
    IF EXISTS (
        SELECT *
        FROM MyTable
        WHERE Column1 = NEW.Column1
        AND Column1 IS NOT NULL
    )
    BEGIN
        RAISERROR('Duplicate unique value detected.', 16, 1);
    END;
END;
ログイン後にコピー

トリガーは実行可能な代替手段を提供しますが、トリガーによって導入される可能性があります。特に高レベルのデータ挿入または更新の場合、パフォーマンスのオーバーヘッドが発生します。

結論として、フィルターされたインデックスは、列に一意の制約を実装するためのより効率的かつ選択的なアプローチを提供します。 NULL 値。ただし、トリガーベースの一意性チェックは、フィルターされたインデックスがサポートされていない環境や、追加の検証ロジックが必要な環境では実行可能なオプションとして機能します。

以上がNULL を許可する SQL Server 列に一意の制約を効率的に適用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート