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

一意の結合された主キーを使用してPostgresテーブルを作成するにはどうすればよいですか?

    一意のインデックスを作成します:

    CREATE UNIQUE INDEX matches_uni_idx ON matches
       (greatest(winner, loser), least(winner, loser));
    

    UNIQUEになることはできません またはPRIMARY KEY 制約。これらは列でのみ機能し、式では機能しないためです。

    serialを追加できます 列はPKとして機能しますが、整数列が2つしかないため、元のPKも非常に効率的です(コメントを参照)。そして、両方の列をNOT NULLにします 自動的。 (それ以外の場合は、NOT NULLを追加します 制約。)

    CHECKを追加することもできます 自分と対戦するプレーヤーを除外するための制約:

    CHECK (winner <> loser)
    

    ヒント:IDのペア(誰が勝ったかわからない場合)を検索するには、同じ式をクエリに組み込むと、インデックスが使用されます:

    SELECT * FROM matches
    WHERE  greatest(winner, loser) = 3  -- the greater value, obviously
    AND    least(winner, loser) = 1;
    

    不明なパラメータを処理していて、どちらが優れているかが事前にわからない場合:

    WITH input AS (SELECT $id1 AS _id1, $id2 AS _id2)  -- input once
    SELECT * FROM matches, input
    WHERE  greatest(winner, loser) = greatest(_id1, _id2)
    AND    least(winner, loser) = least(_id1, _id2);
    

    CTEラッパーは、パラメーターを1回だけ入力するためのものであり、一部のコンテキストでは必要ありません。



    1. コマンドラインを使用したSQLデータベースの移行

    2. ユーザーpostgresは、すべてのCPUを100%使用するプロセスを起動します

    3. LIMIT句に大きなオフセットを使用してMySQLクエリを高速化するにはどうすればよいですか?

    4. MicrosoftAccessデータをExcelに簡単にエクスポートする方法