web-dev-qa-db-ja.com

大きなVARCHARに対する一意の制約-PostgreSQL

私は次のように定義された列を持っています:

data_url character varying(32768) NOT NULL

そしてその列の一意制約:

CONSTRAINT unique_data_url UNIQUE (data_url)

ラージオブジェクトをテーブルに挿入すると、次のエラーメッセージが表示されます。

ERROR:  index row requires 32584 bytes, maximum size is 8191

8191文字を超えるオブジェクトにインデックスを付けることができるように、PostgreSQLをどのように設定できますか?スペースと速度は問題ではありません。これは、多くても数百行のまれにしか変更されないテーブルです。

環境:PostgreSQL 9.3.6、Fedora 20 x64

8
czerny

@ Josh Kupershmidt および @ JoeNahmias で提案されているように、解決策は、長い値のmd5ハッシュでUNIQUEを使用することです。ただし、PostgreSQL 9.3は NIQUE制約 の式をサポートしていないため、式をサポートするindexを使用する必要があります。

create unique index unique_data_url_index on mytable (md5(data_url));
11
czerny

PostgreSQLは、UNIQUE制約をサポートするインデックスを構築します。これほど大きなフィールドにインデックスを付けることはできません。 @ josh-kupershmidtが示唆したように、フィールドのハッシュに制約を作成します。ハッシュの衝突がなければ問題ありません。

3
JoeNahmias