type uuid
i din DDL-sætning er en forkortelse for SET DATA TYPE uuid
. Manualen:
varchar_pattern_ops
er en operatørklasse
det vil blive nævnt i din fejlmeddelelse, hvis du har uuid
bruger denne operatorklasse i ethvert indeks. Typisk for at muliggøre hurtigere sortering, mønstertilpasning og rækkevidde.
For at rette op, skal du slippe modstridende indekser, ændre datatypen og derefter genskabe indekser uden den særlige operatorklasse - if du har stadig brug for dem.
Men nogle typiske forespørgsler, der ville gøre brug af en varchar_pattern_ops
indeks ville stoppe med at arbejde med datatypen uuid
i stedet for varchar
. Ligesom mønster-matching:
Sørg for også at rette sådanne forespørgsler.
@fl0cke påpegede et relateret svar:
Jeg foreslår en lidt anden rute. Det er billigere at droppe indekset, ændre datatypen og derefter oprette et nyt indeks - hvis det stadig er brugbart.
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);
Hvordan finder man det stødende indeks?
I moderne versioner af Postgres får du eksisterende indekser til tabellen med \d tbl
i psql.
For at få alle fuldstændige CREATE INDEX
udsagn for den givne tabel:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
For at få kun dem, der bruger 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:
- Kopiér indekser fra en tabel til en anden
- Hvordan kan jeg slette alle indekser for en tabel i Postgres?