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: