Conforme relatado em DatabaseSchema_pgsql :: changeField e em db_change_field () :
NOTA IMPORTANTE: Para manter a portabilidade do banco de dados, você deve recriar explicitamente todos os índices e chaves primárias que estão usando o campo alterado.
Isso significa que você deve eliminar todas as chaves e índices afetados com db_drop_ {primary_key, unique_key, index} () antes de chamar db_change_field (). Para recriar as chaves e índices, passe as definições de chave como o argumento opcional $ new_keys diretamente para db_change_field ().
Por exemplo, suponha que você tenha:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
e você deseja alterar foo.bar para o tipo serial, deixando-o como a chave primária. A sequência correta é:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Código semelhante é relatado para o Drupal 7.
Lembre-se de que, pela minha experiência, você não pode remover uma chave primária que usa um campo serial. No Drupal 6, eu recebia um erro todas as vezes que tentei fazer isso; Eu não tentei isso no Drupal 7.
Além disso, não conheço nenhum outro problema que você possa ter com os índices de banco de dados.
Sobre como adicionar um índice a uma tabela de banco de dados criada a partir de outro módulo, eu não sugeriria isso, porque:
- Um módulo não descarta um índice para um campo que está sendo alterado, se o próprio módulo não criou esse índice. Não seria possível para o módulo fazer isso porque não sabe o nome do índice.
- Modificar uma tabela de banco de dados criada por outro módulo nunca é uma boa ideia, mesmo que o módulo seja um módulo principal. Se houver outro módulo que altere a mesma tabela, como os módulos podem lidar com qualquer conflito que tenham entre si ou com as alterações que o módulo principal aplicaria ao seu próprio banco de dados?
Se a tabela do banco de dados estiver sendo criada a partir de outro módulo (um módulo principal ou um módulo de terceiros), sugiro abrir uma solicitação de recurso para o módulo, fornecendo um caso de uso para o uso de um novo índice; se houver algum problema de desempenho, a adição de um índice pode ser a coisa desejada a ser feita.
Se você deseja adicionar um índice a uma tabela criada a partir de outro módulo em seu próprio site, esteja preparado para todas as alterações necessárias no seu módulo personalizado toda vez que o módulo for atualizado e antes de instalá-lo em seu próprio site. .
É você quem pode decidir se o trabalho extra vale o desempenho que você obtém. Pessoalmente, acho que não vale a pena.