PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Django/PostgreSQL varchar para UUID


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: