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:
- Copiar índices de una tabla a otra
- ¿Cómo puedo descartar todos los índices de una tabla en Postgres?