sql >> データベース >  >> RDS >> PostgreSQL

行のグループごとに列を一意にするための制約を追加します

    @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'を除くすべての場合 場合。しかし、それは実際にはすべてを含むはるかに大きなインデックスを課します 行。




    1. Oracleで合計行数が10を超える場合、テーブルから行を取得するにはどうすればよいですか?

    2. mysqlテーブルをlatin1からutf8に変換する

    3. リストからすべてのシーケンシャルブロックを取得します

    4. DjangoはPostgreSQLのオートフィールド/IDキーにインデックスを付けますか?