sql >> Databasteknik >  >> RDS >> PostgreSQL

Django/PostgreSQL varchar till UUID

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:



  1. Oracle SQL-sats i java

  2. Anslut till postgres i docker-container från värddator

  3. Hur man implementerar Oracle count (distinct) över partition i Postgres

  4. Bulkladdning till PostgreSQL från en fjärrklient