Seperti yang dilaporkan dalam DatabaseSchema_pgsql :: changeField , dan di db_change_field () :
CATATAN PENTING: Untuk menjaga portabilitas basis data, Anda harus secara eksplisit membuat kembali semua indeks dan kunci utama yang menggunakan bidang yang diubah.
Itu berarti Anda harus membuang semua kunci dan indeks yang terpengaruh dengan db_drop_ {primary_key, unique_key, index} () sebelum memanggil db_change_field (). Untuk membuat ulang kunci dan indeks, berikan definisi kunci sebagai argumen opsional $ new_keys langsung ke db_change_field ().
Misalnya, anggap Anda memiliki:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
dan Anda ingin mengubah foo.bar menjadi tipe serial, meninggalkannya sebagai kunci utama. Urutan yang benar adalah:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Kode serupa dilaporkan untuk Drupal 7.
Ingatlah bahwa, untuk pengalaman saya, Anda tidak dapat menghapus kunci utama yang menggunakan bidang serial. Pada Drupal 6, saya mendapatkan kesalahan setiap kali saya mencoba melakukan itu; Saya tidak mencobanya pada Drupal 7.
Selain itu, saya tidak tahu masalah lain yang Anda miliki dengan indeks basis data.
Tentang menambahkan indeks ke tabel database yang dibuat dari modul lain, saya tidak akan menyarankan melakukan itu, karena:
- Modul tidak menjatuhkan indeks untuk bidang yang sedang diubah, jika modul itu sendiri tidak membuat indeks itu. Tidak mungkin bagi modul untuk melakukan itu karena tidak tahu nama indeks.
- Memodifikasi tabel database yang dibuat oleh modul lain tidak pernah merupakan ide yang baik, bahkan dalam kasus modul adalah modul inti. Jika ada modul lain yang mengubah tabel yang sama, bagaimana modul dapat menangani konflik yang mereka miliki satu sama lain, atau dengan perubahan modul inti akan berlaku untuk database sendiri?
Jika tabel database sedang dibuat dari modul lain (modul inti atau modul pihak ketiga), saya akan menyarankan untuk membuka permintaan fitur untuk modul, menyediakan kasus penggunaan untuk menggunakan indeks baru; jika ada masalah kinerja, menambahkan indeks bisa menjadi hal yang diinginkan untuk dilakukan.
Jika Anda akan menambahkan indeks ke tabel yang dibuat dari modul lain ke situs Anda sendiri, maka bersiaplah untuk setiap perubahan yang perlu Anda lakukan pada modul khusus Anda setiap kali modul diperbarui, dan sebelum Anda menginstalnya di situs Anda sendiri .
Andalah yang dapat memutuskan apakah pekerjaan ekstra itu sepadan dengan kinerja yang Anda dapatkan. Secara pribadi, saya pikir itu tidak layak.