Wie in DatabaseSchema_pgsql :: changeField und in db_change_field () berichtet :
WICHTIGER HINWEIS: Um die Datenbankportabilität zu gewährleisten, müssen Sie alle Indizes und Primärschlüssel, die das geänderte Feld verwenden, explizit neu erstellen.
Das bedeutet, dass Sie alle betroffenen Schlüssel und Indizes mit db_drop_ {primary_key, unique_key, index} () löschen müssen, bevor Sie db_change_field () aufrufen. Übergeben Sie zum erneuten Erstellen der Schlüssel und Indizes die Schlüsseldefinitionen als optionales Argument $ new_keys direkt an db_change_field ().
Angenommen, Sie haben:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
und Sie möchten foo.bar so ändern, dass es seriell ist und als Primärschlüssel verbleibt. Die richtige Reihenfolge ist:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
Ein ähnlicher Code wird für Drupal 7 gemeldet.
Denken Sie daran, dass Sie meiner Erfahrung nach keinen Primärschlüssel entfernen können, der ein serielles Feld verwendet. Auf Drupal 6 bekam ich jedes Mal einen Fehler, wenn ich das versuchte. Das habe ich auf Drupal 7 nicht ausprobiert.
Abgesehen davon kenne ich kein anderes Problem, das Sie mit Datenbankindizes haben könnten.
Das Hinzufügen eines Index zu einer Datenbanktabelle, die aus einem anderen Modul erstellt wurde, würde ich nicht empfehlen, weil:
- Ein Modul löscht keinen Index für ein Feld, das geändert wird, wenn das Modul selbst diesen Index nicht erstellt hat. Dies ist für das Modul nicht möglich, da es den Namen des Index nicht kennt.
- Das Ändern einer Datenbanktabelle, die von einem anderen Modul erstellt wurde, ist keine gute Idee, auch wenn das Modul ein Kernmodul ist. Wenn es ein anderes Modul gibt, das dieselbe Tabelle ändert, wie könnten die Module mit Konflikten umgehen, die sie miteinander haben, oder mit den Änderungen, die das Kernmodul auf seine eigene Datenbank anwenden würde?
Wenn die Datenbanktabelle aus einem anderen Modul (einem Kernmodul oder einem Modul eines Drittanbieters) erstellt wird, würde ich vorschlagen, eine Featureanforderung für das Modul zu öffnen und einen Anwendungsfall für die Verwendung eines neuen Index bereitzustellen. Wenn es Leistungsprobleme gibt, kann das Hinzufügen eines Index die gewünschte Maßnahme sein.
Wenn Sie einer aus einem anderen Modul erstellten Tabelle auf Ihrer eigenen Site einen Index hinzufügen möchten, müssen Sie sich auf alle Änderungen vorbereiten, die Sie bei jeder Aktualisierung des Moduls an Ihrem benutzerdefinierten Modul vornehmen müssen, bevor Sie es auf Ihrer eigenen Site installieren .
Sie können entscheiden, ob die Mehrarbeit die Leistung wert ist, die Sie erhalten. Persönlich halte ich es jedoch nicht für wert.