DatabaseSchema_pgsql :: changeFieldおよびdb_change_field()で報告されているとおり:
重要な注意:データベースの移植性を維持するには、変更されたフィールドを使用しているすべてのインデックスと主キーを明示的に再作成する必要があります。
つまり、db_change_field()を呼び出す前に、db_drop_ {primary_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では試しませんでした。
それ以外は、データベースインデックスで発生する可能性のある他の問題は知りません。
別のモジュールから作成されたデータベーステーブルにインデックスを追加することについては、次の理由から推奨しません。
- モジュール自体がそのインデックスを作成しなかった場合、モジュールは、変更されているフィールドのインデックスを削除しません。モジュールがインデックスの名前を知らないため、モジュールがそれを行うことはできません。
- モジュールがコアモジュールである場合でも、別のモジュールによって作成されたデータベーステーブルを変更することは決して良い考えではありません。同じテーブルを変更する別のモジュールがある場合、それらのモジュールが互いに競合する場合、またはコアモジュールがそれ自体のデータベースに適用する変更をどのように処理できますか?
データベーステーブルが別のモジュール(コアモジュールまたはサードパーティモジュール)から作成されている場合、モジュールの機能要求を開き、新しいインデックスを使用するためのユースケースを提供することをお勧めします。パフォーマンスの問題がある場合は、インデックスを追加することをお勧めします。
別のモジュールから自分のサイトに作成されたテーブルにインデックスを追加する場合は、モジュールが更新されるたびに、また自分のサイトにインストールする前に、カスタムモジュールに必要な変更に備えてください。
余分な作業がパフォーマンスに見合うだけの価値があるかどうかを判断できるのはあなたです。個人的には、それは価値があるとは思わない。