0

操作を含む一意の PostgreSQL インデックスを作成したいと考えています。これが可能かどうか誰にもわかりますか?

CREATE UNIQUE INDEX ux_data ON table (name, color)

追加したい操作は「num & new_num = 0」です。num は既存の列、new_num は挿入する値です。

これは可能ですか?

更新:ここに、私がやりたいことに関する詳細があります。

データベース:

name    color    num
one     red      5
two     green    5
one     red      8

私がやりたいのは、次のようにエントリが一意でない場合を防ぐことです。

新しいエントリ 1: name = one、color = red、num = 1。

一致する名前と色があり、最初の数値チェックの結果は 101 & 001 = 1 です。この新しいエントリ 1 は一意ではなく、数値が 2 に変更された場合は拒否する必要があります。

新しいエントリ 2: name = 1、color = 赤、num = 2

これで、名前と色が一致しました。すべての名前/色の一致数は 101 & 010 = 0、および 1000 & 0010 = 0 であるため、一意のエントリがあります。

4

1 に答える 1

0

これはプロジェクトの半分になります。これを行うための非常に簡単な方法があるようには見えませんが、PostgreSQL では何でも可能です。GIST を使用して除外制約が必要だと思います。残念ながら、これをサポートする簡単なタイプがないため、この除外制約は簡単に実行できるものではありません。

あなたの基本的な解決策には、次のものが含まれる必要があると思います。

  1. 適切なデータ型へのキャスト (おそらく bit(n))

  2. bit(n) の GiST インデックスを許可する十分な演算子。これは、すべての GiST 操作クラスの関数と演算子を構築し、演算子ファミリを作成する必要があることを意味します。

  3. 操作を使用して除外制約を作成します。

これは簡単ではなく、複雑になりますが、ある程度の努力と献身があれば可能です。これを行うには、100 行から 200 行のコードが必要になると思います。おそらく単体テストも書きたいと思うでしょう。

于 2013-04-25T15:35:11.453 に答える