sql >> Database teknologi >  >> RDS >> PostgreSQL

Django/PostgreSQL varchar til UUID

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:



  1. Alligevel for at begrænse MySQL-forespørgselsudførelsestiden?

  2. Jeg har fejlen:SQLSTATE[HY000] [2005] Ukendt MySQL-servervært

  3. Postgres-fejl ved indsættelse - FEJL:ugyldig bytesekvens til kodning af UTF8:0x00

  4. PostgreSQL:Hvad er det maksimale antal tabeller, der kan gemme i postgreSQL-databasen?