Jak podano w DatabaseSchema_pgsql :: changeField oraz w db_change_field () :
WAŻNA UWAGA: Aby zachować przenośność bazy danych, musisz jawnie odtworzyć wszystkie indeksy i klucze podstawowe, które używają zmienionego pola.
Oznacza to, że przed wywołaniem db_change_field () musisz usunąć wszystkie klucze i indeksy, których dotyczy problem, za pomocą db_drop_ {primary_key, unique_key, index} (). Aby odtworzyć klucze i indeksy, przekaż definicje kluczy jako opcjonalny argument $ new_keys bezpośrednio do db_change_field ().
Załóżmy na przykład, że masz:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
i chcesz zmienić foo.bar na typ serial, pozostawiając go jako klucz podstawowy. Prawidłowa sekwencja to:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Podobny kod jest zgłaszany dla Drupal 7.
Należy pamiętać, że z mojego doświadczenia nie można usunąć klucza podstawowego, który używa pola szeregowego. Na Drupal 6 zawsze pojawiał się błąd; Nie próbowałem tego na Drupal 7.
Poza tym nie znam żadnego innego problemu z indeksami baz danych.
Jeśli chodzi o dodawanie indeksu do tabeli bazy danych utworzonej z innego modułu, nie sugerowałbym tego, ponieważ:
- Moduł nie upuszcza indeksu dla zmienianego pola, jeśli sam moduł nie utworzył tego indeksu. Moduł nie byłby w stanie tego zrobić, ponieważ nie zna nazwy indeksu.
- Modyfikowanie tabeli bazy danych utworzonej przez inny moduł nigdy nie jest dobrym pomysłem, nawet jeśli moduł jest modułem podstawowym. Jeśli istnieje inny moduł, który zmienia tę samą tabelę, w jaki sposób moduły mogłyby poradzić sobie z jakimkolwiek konfliktem, jaki mają ze sobą, lub ze zmianami, które moduł podstawowy zastosowałby do własnej bazy danych?
Jeśli tabela bazy danych jest tworzona z innego modułu (modułu podstawowego lub modułu innej firmy), sugerowałbym otwarcie żądania funkcji dla modułu, podając przypadek użycia nowego indeksu; jeśli występuje jakikolwiek problem z wydajnością, pożądane jest dodanie indeksu.
Jeśli zamierzasz dodać indeks do tabeli utworzonej z innego modułu we własnej witrynie, przygotuj się na wszelkie zmiany, które musisz wprowadzić w module niestandardowym za każdym razem, gdy moduł jest aktualizowany, a przed zainstalowaniem go we własnej witrynie .
To Ty decydujesz, czy dodatkowa praca jest warta wydajności, którą otrzymasz. Osobiście nie sądzę, żeby było warto.