Як повідомляється в DatabaseSchema_pgsql :: changeField та в db_change_field () :
ВАЖЛИВА ПРИМІТКА. Щоб зберегти портативність бази даних, вам потрібно чітко відтворити всі індекси та первинні ключі, які використовують змінене поле.
Це означає, що перед тим, як викликати db_change_field (), ви повинні скинути всі постраждалі ключі та індекси за допомогою db_drop_ {basic_key, unique_key, index} (). Щоб відтворити ключі та індекси, передайте ключові визначення як необов'язковий аргумент $ new_keys безпосередньо в db_change_field ().
Наприклад, припустимо, що у вас є:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
і ви хочете змінити foo.bar на тип послідовного, залишаючи його в якості основного ключа. Правильна послідовність:
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.
Крім того, я не знаю жодної іншої проблеми з індексами баз даних.
Щодо додавання індексу до таблиці бази даних, створеної з іншого модуля, я б не пропонував це робити, оскільки:
- Модуль не скидає індекс для поля, яке змінюється, якщо сам модуль не створив цей індекс. Модуль не міг би це зробити, оскільки він не знає назви індексу.
- Змінення таблиці бази даних, створеної іншим модулем, ніколи не є хорошою ідеєю, навіть у випадку, якщо модуль є основним модулем. Якщо є інший модуль, який змінює ту саму таблицю, як вони могли б впоратися з будь-яким конфліктом, який вони мали один з одним, або зі змінами, який основний модуль застосував би до власної бази даних?
Якщо таблиця бази даних створюється з іншого модуля (основного модуля або стороннього модуля), я б запропонував відкрити запит на функцію для модуля, надавши випадок використання для використання нового індексу; якщо є якісь проблеми ефективності, додавання індексу може бути бажаною справою.
Якщо ви збираєтеся додати індекс до таблиці, створеної з іншого модуля, на свій власний сайт, то будьте готові до будь-яких змін, які потрібно зробити у вашому користувальницькому модулі щоразу, коли модуль оновлюється, і перед тим, як встановити його на свій власний сайт .
Саме ви можете вирішити, чи варто додаткова робота вашої продуктивності. Особисто я не думаю, що це варто.