PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django/PostgreSQL-Varchar zu UUID

type uuid in Ihrer DDL-Anweisung ist eine Abkürzung für SET DATA TYPE uuid . Das Handbuch:

varchar_pattern_ops ist eine Operatorklasse das würde in Ihrer Fehlermeldung erwähnt werden, wenn Sie uuid haben Verwenden dieser Operatorklasse in einem beliebigen Index. In der Regel, um eine schnellere Sortierung, Mustererkennung und Bereichsbedingungen zu ermöglichen.

Um das Problem zu beheben, löschen Sie widersprüchliche Indizes, ändern Sie den Datentyp und erstellen Sie die Indizes dann ohne die spezielle Operatorklasse - if - neu Sie brauchen sie noch.

Allerdings einige typische Abfragen, die einen varchar_pattern_ops verwenden würden index würde mit dem Datentyp uuid nicht mehr funktionieren statt varchar . Wie Mustervergleich:

Stellen Sie sicher, dass Sie auch solche Abfragen beheben.

@fl0cke wies darauf hin eine verwandte Antwort:

Ich schlage eine etwas andere Route vor. Es ist billiger, den Index zu löschen, den Datentyp zu ändern und dann Erstellen Sie einen neuen Index - wenn es noch nützlich ist.

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);

Wie finde ich einen anstößigen Index?

In modernen Versionen von Postgres erhalten Sie vorhandene Indizes für die Tabelle mit \d tbl in psql.

Um alle vollständigen CREATE INDEX zu erhalten Anweisungen für die angegebene Tabelle:

SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM   pg_index
WHERE  indrelid = 'public.tbl'::regclass;  -- optionally schema-qualified

Um nur die zu erhalten, verwenden Sie 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';

Einzelheiten: