type uuid
em sua instrução DDL é uma abreviação para SET DATA TYPE uuid
. O manual:
varchar_pattern_ops
é uma classe de operador
que seria mencionado em sua mensagem de erro se você tiver uuid
usando esta classe de operador em qualquer índice. Normalmente para permitir uma classificação mais rápida, correspondência de padrões e condições de intervalo. Para corrigir, elimine índices conflitantes, altere o tipo de dados e recrie índices sem a classe de operador especial - if você ainda precisa deles.
No entanto, algumas consultas típicas que fariam uso de um
varchar_pattern_ops
index pararia de funcionar com o tipo de dados uuid
em vez de varchar
. Como correspondência de padrões:Certifique-se de corrigir essas consultas também.
@fl0cke apontou uma resposta relacionada:
Sugiro um caminho um pouco diferente. É mais barato descartar o índice, alterar o tipo de dados e então crie um novo índice - se ainda for útil.
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);
Como encontrar o índice ofensivo?
Nas versões modernas do Postgres, você obtém índices existentes para a tabela com
\d tbl
em psql. Para obter todos os
CREATE INDEX
completos declarações para a tabela fornecida:SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Para obter apenas os que usam
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';
Detalhes:
- Copiar índices de uma tabela para outra
- Como posso eliminar todos os índices de uma tabela no Postgres?