sql >> Base de Datos >  >> RDS >> PostgreSQL

Django/PostgreSQL varchar a UUID

type uuid en su declaración DDL es una abreviatura de SET DATA TYPE uuid . El manual:

varchar_pattern_ops es una clase de operador eso se mencionaría en su mensaje de error si tiene uuid utilizando esta clase de operador en cualquier índice. Por lo general, para permitir una clasificación más rápida, coincidencia de patrones y condiciones de rango.

Para solucionarlo, elimine los índices en conflicto, modifique el tipo de datos y luego vuelva a crear los índices sin la clase de operador especial - si todavía los necesitas.

Sin embargo, algunas consultas típicas que harían uso de un varchar_pattern_ops index dejaría de funcionar con el tipo de datos uuid en lugar de varchar . Como coincidencia de patrones:

Asegúrese de corregir también dichas consultas.

@fl0cke señaló una respuesta relacionada:

Sugiero una ruta ligeramente diferente. Es más barato eliminar el índice, cambiar el tipo de datos y luego cree un nuevo índice, si aún es ú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);

¿Cómo encontrar el índice infractor?

En las versiones modernas de Postgres, obtiene índices existentes para la tabla con \d tbl en psql.

Para obtener todos los CREATE INDEX completos declaraciones para la tabla dada:

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

Para obtener solo los que usan 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';

Detalles: