PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Django/PostgreSQL varchar en UUID

type uuid dans votre déclaration DDL est un raccourci pour SET DATA TYPE uuid . Le manuel :

varchar_pattern_ops est une classe d'opérateur cela serait mentionné dans votre message d'erreur si vous avez uuid en utilisant cette classe d'opérateur dans n'importe quel index. Généralement pour permettre un tri, une correspondance de modèle et des conditions de plage plus rapides.

Pour corriger, supprimez les index en conflit, modifiez le type de données, puis recréez les index sans la classe d'opérateur spéciale - if vous en avez encore besoin.

Cependant, certaines requêtes typiques qui utiliseraient un varchar_pattern_ops index cesserait de fonctionner avec le type de données uuid au lieu de varchar . Comme le pattern-matching :

Assurez-vous également de corriger ces requêtes.

@fl0cke a souligné une réponse connexe :

Je propose un itinéraire un peu différent. Il est moins cher de supprimer l'index, de modifier le type de données et puis créer un nouvel index - s'il est toujours utile.

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

Comment trouver l'index offensant ?

Dans les versions modernes de Postgres, vous obtenez des index existants pour la table avec \d tbl en psql.

Pour obtenir tous les CREATE INDEX complets instructions pour la table donnée :

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

Pour obtenir uniquement ceux en utilisant 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';

Détails :