Saya sedang mengerjakan fungsi yang memungkinkan saya untuk menambah indeks jika tidak ada. Saya mengalami masalah yang tidak bisa saya bandingkan dengan daftar indeks. Adakah pikiran?
Ini adalah masalah yang mirip dengan pembuatan kolom yang diselesaikan dengan kode ini:
https://stackoverflow.com/a/12603892/368511
Jawaban:
Nama indeks di PostgreSQL
Jika Anda tidak peduli dengan nama indeks, mintalah nama Postgres secara otomatis:
hampir sama dengan:
Kecuali bahwa Postgres akan menghindari tabrakan penamaan dan secara otomatis memilih nama gratis berikutnya:
Cobalah. Tapi, jelas, Anda tidak ingin membuat beberapa indeks berlebihan. Jadi bukan ide yang bagus untuk secara buta membuat yang baru.
Uji keberadaan
Postgres 9.3 atau lebih tua
Cara yang sangat sederhana untuk menguji adalah dengan memasukkan nama yang memenuhi syarat skema ke
regclass
:Jika ada pengecualian, nama itu gratis.
Atau, untuk menguji hal yang sama tanpa melemparkan pengecualian, digunakan dalam
DO
pernyataan:Ini tidak berfungsi
CREATE INDEX CONCURRENTLY
, karena varian itu tidak dapat dibungkus dengan transaksi luar. Lihat komentar oleh @Gregory di bawah ini.The
DO
pernyataan diperkenalkan dengan Postgres 9.0. Di versi sebelumnya Anda harus membuat fungsi untuk melakukan hal yang sama.Detail tentang
pg_class
di manual .Dasar-dasar tentang indeks dalam manual .
Postgres 9.4
Anda dapat menggunakan fungsi baru
to_regclass()
untuk memeriksa tanpa melemparkan pengecualian:Mengembalikan NULL jika indeks (atau objek lain) dari nama itu tidak ada. Lihat:
Postgres 9.5
Sekarang tersedia:
Itu juga berhasil
CREATE INDEX CONCURRENTLY IF NOT EXISTS
.Namun, manual ini memperingatkan :
Ini pemeriksaan sederhana untuk nama objek. Berlaku untuk semua varian di sini.
sumber
CONCURRENTLY
dengan cara ini. Anda akan mendapatkannyaERROR: CREATE INDEX CONCURRENTLY cannot be executed from a function or multi-command string
.Ini akan tersedia dalam 9,5. Inilah git commit aktual https://github.com/postgres/postgres/commit/08309aaf74ee879699165ec8a2d53e56f2d2e947
Diskusi tentang peretas pg http://postgresql.nabble.com/CREATE-IF-NOT-EXISTS-INDEX-td5821173.html
sumber