Как сообщается в DatabaseSchema_pgsql :: changeField и в db_change_field () :
ВАЖНОЕ ПРИМЕЧАНИЕ. Чтобы поддерживать переносимость базы данных, необходимо явно воссоздать все индексы и первичные ключи, которые используют измененное поле.
Это означает, что вы должны удалить все затронутые ключи и индексы с помощью db_drop_ {primary_key, unique_key, index} () перед вызовом db_change_field (). Чтобы воссоздать ключи и индексы, передайте определения ключей как необязательный аргумент $ new_keys непосредственно в db_change_field ().
Например, предположим, у вас есть:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
и вы хотите изменить foo.bar на тип serial, оставив его в качестве первичного ключа. Правильная последовательность:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Аналогичный код сообщается для Drupal 7.
Имейте в виду, что, по моему опыту, вы не можете удалить первичный ключ, который использует последовательное поле. На Drupal 6 я каждый раз получал сообщение об ошибке; Я не пробовал это на Drupal 7.
Кроме этого, я не знаю никакой другой проблемы, которую вы могли бы иметь с индексами базы данных.
О добавлении индекса в таблицу базы данных, созданную из другого модуля, я бы не советовал делать это, потому что:
- Модуль не удаляет индекс для изменяемого поля, если сам модуль не создал этот индекс. Модуль не сможет сделать это, потому что он не знает имени индекса.
- Модификация таблицы базы данных, созданной другим модулем, никогда не будет хорошей идеей, даже если модуль является основным модулем. Если есть другой модуль, который изменяет ту же таблицу, как модули могут обрабатывать любые конфликты, которые они имеют друг с другом, или с изменениями, которые основной модуль будет применять к своей собственной базе данных?
Если таблица базы данных создается из другого модуля (базовый модуль или сторонний модуль), я бы предложил открыть запрос функциональности для модуля, предоставив вариант использования для использования нового индекса; если есть какие-либо проблемы с производительностью, можно добавить индекс.
Если вы собираетесь добавить индекс к таблице, созданной из другого модуля, на свой собственный сайт, будьте готовы к любым изменениям, которые необходимо вносить в свой пользовательский модуль каждый раз, когда модуль обновляется, и прежде чем устанавливать его на свой собственный сайт. ,
Именно вы можете решить, стоит ли дополнительная работа того, что вы получаете. Лично я не думаю, что оно того стоит.