type uuid
dalam pernyataan DDL Anda adalah singkatan untuk SET DATA TYPE uuid
. Manual:
varchar_pattern_ops
adalah kelas operator
yang akan disebutkan dalam pesan kesalahan Anda jika Anda memiliki uuid
menggunakan kelas operator ini dalam indeks apa pun. Biasanya untuk mengaktifkan kondisi penyortiran, pencocokan pola, dan rentang yang lebih cepat.
Untuk memperbaikinya, hapus indeks yang bertentangan, ubah tipe data, lalu buat kembali indeks tanpa kelas operator khusus - jika Anda masih membutuhkannya.
Namun, beberapa kueri umum yang akan menggunakan varchar_pattern_ops
index akan berhenti bekerja dengan tipe data uuid
bukannya varchar
. Seperti pencocokan pola:
Pastikan untuk memperbaiki pertanyaan seperti itu juga.
@fl0cke ditunjukkan jawaban terkait:
Saya menyarankan rute yang sedikit berbeda. Lebih murah untuk menjatuhkan indeks, mengubah tipe data dan lalu buat indeks baru - jika masih berguna.
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);
Bagaimana cara menemukan indeks yang menyinggung?
Dalam versi Postgres modern, Anda mendapatkan indeks yang ada untuk tabel dengan \d tbl
di psql.
Untuk mendapatkan semua CREATE INDEX
complete pernyataan untuk tabel yang diberikan:
SELECT pg_get_indexdef(indexrelid) || ';' AS idx
FROM pg_index
WHERE indrelid = 'public.tbl'::regclass; -- optionally schema-qualified
Untuk mendapatkan yang hanya menggunakan 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';
Detail:
- Menyalin indeks dari satu tabel ke tabel lainnya
- Bagaimana cara menghapus semua indeks tabel di Postgres?