Come riportato in DatabaseSchema_pgsql :: changeField e in db_change_field () :
NOTA IMPORTANTE: per mantenere la portabilità del database, è necessario ricreare esplicitamente tutti gli indici e le chiavi primarie che utilizzano il campo modificato.
Ciò significa che prima di chiamare db_change_field () è necessario eliminare tutte le chiavi e gli indici interessati con db_drop_ {primary_key, unique_key, index} (). Per ricreare le chiavi e gli indici, passare le definizioni delle chiavi come argomento facoltativo $ new_keys direttamente a db_change_field ().
Ad esempio, supponiamo di avere:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
e vuoi cambiare foo.bar in modo che sia di tipo seriale, lasciandolo come chiave primaria. La sequenza corretta è:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Codice simile è riportato per Drupal 7.
Tieni presente che, per la mia esperienza, non puoi rimuovere una chiave primaria che utilizza un campo seriale. Su Drupal 6, ho avuto un errore tutte le volte che ho provato a farlo; Non l'ho provato su Drupal 7.
A parte questo, non conosco nessun altro problema che potresti avere con gli indici del database.
Informazioni sull'aggiunta di un indice a una tabella di database creata da un altro modulo, non consiglierei di farlo, perché:
- Un modulo non rilascia un indice per un campo che viene modificato, se il modulo stesso non ha creato quell'indice. Non sarebbe possibile per il modulo farlo perché non conosce il nome dell'indice.
- Modificare una tabella di database creata da un altro modulo non è mai una buona idea, anche nel caso in cui il modulo sia un modulo principale. Se esiste un altro modulo che modifica la stessa tabella, in che modo i moduli potrebbero gestire eventuali conflitti tra loro o con le modifiche che il modulo principale applicherebbe al proprio database?
Se la tabella del database viene creata da un altro modulo (un modulo principale o un modulo di terze parti), suggerirei di aprire una richiesta di funzionalità per il modulo, fornendo un caso d'uso per l'utilizzo di un nuovo indice; se ci sono problemi di prestazioni, l'aggiunta di un indice potrebbe essere la cosa desiderata da fare.
Se hai intenzione di aggiungere un indice a una tabella creata da un altro modulo sul tuo sito, allora preparati a tutte le modifiche che devi apportare al tuo modulo personalizzato ogni volta che il modulo viene aggiornato e prima di installarlo nel tuo sito .
Sei tu che puoi decidere se il lavoro extra vale la prestazione che ottieni. Personalmente, non penso che valga la pena, però.