type uuid
nell'istruzione DDL è l'abbreviazione di SET DATA TYPE uuid
. Il manuale:
varchar_pattern_ops
è una classe operatore
che verrebbe menzionato nel tuo messaggio di errore se hai uuid
utilizzando questa classe operatore in qualsiasi indice. In genere per consentire un ordinamento, una corrispondenza dei modelli e condizioni di intervallo più rapidi.
Per risolvere il problema, elimina gli indici in conflitto, modifica il tipo di dati e quindi ricrea gli indici senza la classe dell'operatore speciale - if ne hai ancora bisogno.
Tuttavia, alcune query tipiche che farebbero uso di un varchar_pattern_ops
index smetterebbe di funzionare con il tipo di dati uuid
invece di varchar
. Come la corrispondenza dei modelli:
Assicurati di correggere anche eventuali domande di questo tipo.
@fl0cke ha sottolineato una risposta correlata:
Suggerisco un percorso leggermente diverso. È più economico eliminare l'indice, modificare il tipo di dati e poi crea un nuovo indice, se è ancora 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);
Come trovare l'indice offensivo?
Nelle versioni moderne di Postgres ottieni gli indici esistenti per la tabella con \d tbl
in psql.
Per ottenere tutto completare CREATE INDEX
istruzioni per la tabella data:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Per ottenere solo quelli usando 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';
Dettagli:
- Copia gli indici da una tabella all'altra
- Come posso eliminare tutti gli indici di una tabella in Postgres?