type uuid
i din DDL-sats är en förkortning för SET DATA TYPE uuid
. Handboken:
varchar_pattern_ops
är en operatörsklass
som skulle nämnas i ditt felmeddelande om du har uuid
använder denna operatorklass i vilket index som helst. Vanligtvis för att möjliggöra snabbare sortering, mönstermatchning och intervallförhållanden.
För att fixa, släpp motstridiga index, ändra datatypen och återskapa sedan index utan den speciella operatorklassen - if du behöver dem fortfarande.
Men några typiska frågor som skulle använda en varchar_pattern_ops
index skulle sluta fungera med datatypen uuid
istället för varchar
. Som mönstermatchning:
Se till att åtgärda sådana frågor också.
@fl0cke påpekade ett relaterat svar:
Jag föreslår en lite annorlunda väg. Det är billigare att ta bort indexet, ändra datatyp och sedan skapa ett nytt index - om det fortfarande är användbart.
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);
Hur hittar man ett index som är kränkande?
I moderna versioner av Postgres får du befintliga index för tabellen med \d tbl
i psql.
För att få alla fullständiga CREATE INDEX
uttalanden för den givna tabellen:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
För att få bara de som använder 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';
Detaljer: