ホームページ > データベース > mysql チュートリアル > 特定の条件が満たされた場合にのみテーブル列に一意制約を作成するにはどうすればよいですか?

特定の条件が満たされた場合にのみテーブル列に一意制約を作成するにはどうすればよいですか?

DDD
リリース: 2025-01-10 10:44:43
オリジナル
332 人が閲覧しました

How Can I Create a Unique Constraint on a Table Column Only When a Specific Condition is Met?

条件付きの一意性の実装: トリガーの優れた代替手段

多くの場合、データベース設計ではテーブル列に一意の制約が必要ですが、それは特定の状況下でのみ必要です。 これを例で説明してみましょう:

TableID、および Name を含むテーブル RecordStatus について考えます。 RecordStatus は 1 (アクティブ) または 2 (削除) です。 目的は、アクティブなレコード (ID = 1) に対してのみ RecordStatus 列の一意性を強制し、削除されたレコードの重複を許可することです。

トリガーを避ける理由

トリガーでもこれを実現できますが、より効率的で堅牢なソリューションは、フィルターされたインデックスを使用することです。

フィルターされたインデックスの力

フィルターされたインデックスは、フィルター条件によって定義されたテーブル データのサブセットにインデックスを作成します。これにより、インデックス作成を正確に制御でき、条件付きの一意制約または主キー制約に最適です。

条件付き一意制約の作成

ID が 1 の場合にのみ RecordStatus に一意性を適用するには、次のコマンドを使用します。

<code class="language-sql">CREATE UNIQUE INDEX MyIndex ON MyTable(ID) WHERE RecordStatus = 1;</code>
ログイン後にコピー

これにより、ID 列に一意のインデックスが作成されますが、RecordStatus が 1 に等しい行のみが考慮されます。

期待される動作

ID = 1 で重複した RecordStatus 値を挿入しようとすると、次のようなエラーが発生します。

<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>
ログイン後にコピー

概要

フィルターされたインデックスは、条件付き一意制約を作成するためのクリーンで効率的なアプローチを提供します。 これらは、トリガーに伴うパフォーマンスのオーバーヘッドを発生させることなくデータの整合性を強化し、複雑なデータベース要件に対してよりスケーラブルで保守可能なソリューションを提供します。 フィルター条件を正確に定義することで、特定のビジネス ルールに完全に合わせて一意性を選択的に適用できます。

以上が特定の条件が満たされた場合にのみテーブル列に一意制約を作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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