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?