@lad2025コメント 、status
実際にはboolean
である必要があります
。安くてきれい。
どちらの方法でも、部分的な一意のインデックス<を使用してルールを課すことができます。 / strong> :
status = 'Active'
で0行または1行を許可するには テーブル全体 :
CREATE UNIQUE INDEX tbl_active_uni ON tbl (status)
WHERE status = 'Active';
status = 'Active'
で0行または1行を許可するには userid
ごと 、userid
を作成します インデックス付きの列:
CREATE UNIQUE INDEX tbl_userid_active_uni ON tbl (userid)
WHERE status = 'Active';
userid IS NULL
に注意してください 2つのNULL値が等しいと見なされることはないため、一意の違反はトリガーされません。 userid
set NOT NULL
である必要があります
この場合。
なぜ制約ではなくインデックスを作成するのですか?
コメント内の質問
:これはインデックスであり、 CONSTRAINT
>
。
最初のケースのインデックスは小さいです 、1行を保持するか、行を保持しません。
2番目のケースのインデックスは、既存のuserid
ごとに1行を保持します。 、しかしそれは最も安くて最速の方法です 、清潔で安全であることに加えて。これを高速化するには、どのような場合でも他の行をチェックするためのインデックスが必要になります。
CHECK
を持つことはできません 他の行の制約チェック-少なくともクリーンで信頼できる方法ではありません。 絶対にお勧めしない方法がいくつかあります この場合:
UNIQUE
を使用する場合 (userid, status)
の制約 (これもバックグラウンドで一意のインデックスを使用して実装されます!)、部分的にすることはできません。 、およびすべて 組み合わせは一意になるように強制されます。あなたはできた status IS NULL
を使用する場合は、引き続きこれを使用してください 'Active'
を除くすべての場合 場合。しかし、それは実際にはすべてを含むはるかに大きなインデックスを課します 行。