type uuid
ve vašem příkazu DDL je zkratka pro SET DATA TYPE uuid
. Příručka:
varchar_pattern_ops
je třída operátorů
to by bylo uvedeno ve vaší chybové zprávě, pokud máte uuid
pomocí této třídy operátorů v libovolném indexu. Obvykle za účelem rychlejšího třídění, porovnávání vzorů a podmínek rozsahu.
Chcete-li to opravit, zrušte konfliktní indexy, změňte typ dat a poté znovu vytvořte indexy bez speciální třídy operátorů - if stále je potřebujete.
Některé typické dotazy však využívají varchar_pattern_ops
index by přestal fungovat s datovým typem uuid
místo varchar
. Jako porovnávání vzorů:
Nezapomeňte také opravit všechny takové dotazy.
upozornění na @fl0cke související odpověď:
Navrhuji trochu jinou cestu. Je levnější index zrušit, změnit typ dat a pak vytvořte nový index – pokud je stále užitečný.
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 najít problematický index?
V moderních verzích Postgresu získáte existující indexy pro tabulku pomocí \d tbl
v psql.
Chcete-li získat všechny kompletní CREATE INDEX
výpisy pro danou tabulku:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Chcete-li získat pouze ty pomocí 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';
Podrobnosti: