4

次のコマンド(Postgresql)を実行しようとしました:

ALTER TABLE authentication ADD CONSTRAINT overlapping_times EXCLUDE USING GIST
(method with =,
 authenticator with =,
 box(point(extract(epoch FROM validfrom at time zone 'UTC'),extract(epoch FROM validfrom at time zone 'UTC') ),
     point(extract(epoch FROM validuntil at time zone 'UTC'), extract(epoch FROM validuntil at time zone 'UTC'))) WITH &&
)

次のエラーメッセージが表示されました。

ERROR:  data type character varying has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

私はかなり広範囲のグーグルをしましたが、それでもこれを平易な英語に翻訳することはできません。上記のコマンドを実行するにはどうすればよいですか?「メソッド」のタイプは文字によって異なり、「オーセンティケーター」はテキスト、「validfrom」、「validuntil」は日付です。

4

1 に答える 1

2

authenticatorおよびにはmethod、単純な一意の制約を使用します。textとvarchar()は、索引付けの目的で同一です。

これは、1つではなく3つのalter tableステートメントを意味しますが、これらの問題を回避できるはずです。BoxはGiSTを適切にサポートする必要があるので、そこでうまくいくはずです。

平易な英語では、エラーは、データ型がインデックス型に期待されるインデックス操作をサポートしていないことを示しています。そのため、たとえば、テキスト文字列が重複しているかどうかをインデックスで検索することはできません。言い換えれば、3つを同じ制約に入れることはできません。

さらに、UNIQUE制約は除外制約よりも高速であるため、機能する場所で優先されることに注意してください。

于 2013-04-22T06:49:07.400 に答える