SQL Server での条件付き一意制約の実現: トリガーフリーのアプローチ
データの整合性を維持するには、多くの場合、データのサブセットに選択的に適用される一意の制約が必要になります。 トリガーは一般的なソリューションですが、SQL Server ではフィルターされたインデックスを使用したより洗練された方法が提供されています。
条件付きの一意性のためにフィルタリングされたインデックスを活用する
フィルターされたインデックスは、フィルター条件によって決定されるテーブルの行の一部のみにインデックスを付けます。これにより、条件付きの一意制約が可能になります。
RecordStatus が 1 の場合にのみ (ID, RecordStatus) の一意性が必要なシナリオを考えてみましょう。解決策は簡単です。
<code class="language-sql">CREATE UNIQUE INDEX MyIndex ON MyTable(ID) WHERE RecordStatus = 1;</code>
このインデックスは、RecordStatus = 1
の行のみにインデックスを付けるため、このサブセットの一意性が強制されます。 この制約に違反すると、エラーが発生します:
<code>Msg 2601, Level 14, State 1, Line 13 Cannot insert duplicate key row in object 'dbo.MyTable' with unique index 'MyIndex'. The duplicate key value is (9999).</code>
重要な考慮事項
フィルター インデックスは SQL Server 2008 で導入されました。以前のバージョンでは、トリガー、または一意の制約と行のバージョン管理手法の組み合わせが代替手段として必要です。
以上がトリガーを使用せずに SQL Server で条件付き一意制約を強制するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。