type uuid във вашия DDL оператор е стенограма за SET DATA TYPE uuid . Ръководството:
varchar_pattern_ops е операторен клас
което ще бъде споменато във вашето съобщение за грешка, ако имате uuid използвайки този операторен клас във всеки индекс. Обикновено за активиране на по-бързо сортиране, съвпадение на шаблони и условия за обхват.
За да коригирате, премахнете конфликтните индекси, променете типа данни и след това създайте отново индекси без специалния операторен клас - if все още се нуждаете от тях.
Въпреки това, някои типични заявки, които биха използвали varchar_pattern_ops index ще спре да работи с тип данни uuid вместо varchar . Като съпоставяне на образец:
Уверете се, че коригирате и всички подобни заявки.
@fl0cke посочи свързан отговор:
Предлагам малко по-различен маршрут. По-евтино е да премахнете индекса, да промените типа на данните и след това създайте нов индекс - ако все още е полезен.
DROP INDEX tbl_guid_varchar_pattern_ops_idx;
ALTER TABLE tbl ALTER COLUMN guid TYPE uuid USING guid::uuid;
CREATE INDEX tbl_guid_idx ON tbl (guid);
Как да намеря обиден индекс?
В съвременните версии на Postgres получавате съществуващи индекси за таблицата с \d tbl в psql.
За да получите целия пълен CREATE INDEX изрази за дадената таблица:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
За да получите само тези, които използват varchar_pattern_ops :
SELECT pg_get_indexdef(i.indexrelid) || ';' AS idx
FROM pg_index i
JOIN pg_opclass o ON o.oid = ANY (i.indclass)
WHERE i.indrelid = 'public.big'::regclass
AND o.opcname = 'varchar_pattern_ops';
Подробности:
- Копиране на индекси от една таблица в друга
- Как мога да премахна всички индекси на таблица в Postgres?