Como se informó en DatabaseSchema_pgsql :: changeField y en db_change_field () :
NOTA IMPORTANTE: Para mantener la portabilidad de la base de datos, debe recrear explícitamente todos los índices y claves principales que utilizan el campo modificado.
Eso significa que debe eliminar todas las claves e índices afectados con db_drop_ {primary_key, unique_key, index} () antes de llamar a db_change_field (). Para recrear las claves y los índices, pase las definiciones clave como el argumento opcional $ new_keys directamente a db_change_field ().
Por ejemplo, suponga que tiene:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
y desea cambiar foo.bar para que sea de tipo serial, dejándolo como la clave principal. La secuencia correcta es:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Se informa un código similar para Drupal 7.
Tenga en cuenta que, según mi experiencia, no puede eliminar una clave primaria que utiliza un campo en serie. En Drupal 6, recibí un error cada vez que intentaba hacerlo; No probé eso en Drupal 7.
Aparte de eso, no conozco ningún otro problema que pueda tener con los índices de la base de datos.
Acerca de agregar un índice a una tabla de base de datos que se crea desde otro módulo, no sugeriría hacerlo porque:
- Un módulo no suelta un índice para un campo que se está cambiando, si el módulo en sí no creó ese índice. No sería posible que el módulo haga eso porque no conoce el nombre del índice.
- Modificar una tabla de base de datos creada por otro módulo nunca es una buena idea, incluso en el caso de que el módulo sea un módulo central. Si hay otro módulo que cambia la misma tabla, ¿cómo podrían los módulos manejar cualquier conflicto que tengan entre sí, o con los cambios que el módulo central aplicaría a su propia base de datos?
Si la tabla de la base de datos se está creando desde otro módulo (un módulo central o un módulo de terceros), sugeriría abrir una solicitud de función para el módulo, proporcionando un caso de uso para usar un nuevo índice; Si hay algún problema de rendimiento, agregar un índice podría ser lo que se desea hacer.
Si va a agregar un índice a una tabla creada a partir de otro módulo en su propio sitio, entonces esté preparado para cualquier cambio que necesite hacer a su módulo personalizado cada vez que el módulo se actualice y antes de instalarlo en su propio sitio .
Es usted quien puede decidir si el trabajo extra vale el rendimiento que obtiene. Sin embargo, personalmente no creo que valga la pena.