Как использовать uuid с postgresql gist в ограничении EXCLUDE
Я получаю сообщение об ошибке, в то время как я использую ограничение исключения с помощью GIST
ALTER TABLE tbl_product ADD EXCLUDE USING gist (base_id WITH =, lifetime WITH &&);
ERROR: data type uuid 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.
Замечания:base_id
тип данных uuid, lifetime
тип данных - период
Я использую PostgreSQL 9.4. Я должен использовать только 9.4, так как у меня нет другого выбора, так как я не могу установить temporal
расширение в 9.5, 9.6 и 10 дает ошибку.
2 ответа
Вам понадобится btree_gist
расширение для этого:
btree_gist
предоставляет классы операторов индекса GiST, которые реализуют эквивалентное поведение B-дерева для типов данныхint2
,int4
,int8
,float4
,float8
,numeric
,timestamp with time zone
,timestamp without time zone
,time with time zone
,time without time zone
,date
,interval
,oid
,money
,char
,varchar
,text
,bytea
,bit
,varbit
,macaddr
,macaddr8
,inet
,cidr
,uuid
, и всеenum
типы.
К сожалению поддержка uuid
был добавлен только в v10.
С v10 вы сможете использовать
base_id gist_uuid_ops WITH =
в вашем ограничении исключения.
С 9.4 вы можете сначала преобразовать столбец в другой тип:
(base_id::text) gist_text_ops WITH =
Принятый ответ правильный,
btree_gist
необходимо, однако предлагаемое решение не работает (по крайней мере, не в v12 в 2021 году). Если вы получаете ошибки, как в исходном вопросе, вы должны сделать следующее:
CREATE EXTENSION IF NOT EXISTS btree_gist;
ALTER TABLE tbl_product ADD EXCLUDE USING gist (base_id WITH =, lifetime WITH &&);
В качестве бонуса я использовал его в Elixir и Ecto 3.5, и вот как это сделать в миграции Ecto:
execute "CREATE EXTENSION IF NOT EXISTS btree_gist"
create constraint(:tbl_product, "constraint_name", exclude: ~s|gist ("base_id" WITH =, lifetime WITH &&)|)