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 :
- Copier les index d'une table à une autre
- Comment supprimer tous les index d'une table dans Postgres ?