type uuid w instrukcji DDL jest skrótem dla SET DATA TYPE uuid . Podręcznik:
varchar_pattern_ops to klasa operatora
które zostaną wymienione w komunikacie o błędzie, jeśli masz uuid używając tej klasy operatora w dowolnym indeksie. Zwykle w celu umożliwienia szybszego sortowania, dopasowywania wzorców i warunków zakresu.
Aby naprawić, usuń sprzeczne indeksy, zmień typ danych, a następnie ponownie utwórz indeksy bez specjalnej klasy operatora - jeśli nadal ich potrzebujesz.
Jednak niektóre typowe zapytania, które wykorzystują varchar_pattern_ops index przestanie działać z typem danych uuid zamiast varchar . Podobnie jak dopasowywanie wzorców:
Upewnij się, że naprawiłeś również wszelkie takie zapytania.
@fl0cke wskazał powiązana odpowiedź:
Proponuję nieco inną trasę. Taniej jest upuścić indeks, zmienić typ danych i wtedy utwórz nowy indeks - jeśli nadal jest przydatny.
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);
Jak znaleźć obraźliwy indeks?
We współczesnych wersjach Postgresa otrzymujesz istniejące indeksy dla tabeli za pomocą \d tbl w psql.
Aby uzyskać wszystkie kompletne CREATE INDEX zestawienia dla podanej tabeli:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Aby uzyskać tylko te, używając 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';
Szczegóły: