6 Stimmen

MySQL Fremdschlüssel Frage

Definiert das Definieren eines Fremdschlüssels auch einen Index? Ich habe mysql v5.1.46 und schaue mir das MySQL Administrator-Tool an, das den Fremdschlüssel als Index zeigt, also wollte ich das bestätigen?

8voto

Mark Byers Punkte 761508
  • Wenn bereits ein nutzbarer Index vorhanden ist (ein Index, bei dem die Fremdschlüsselspalten in derselben Reihenfolge als erste Spalten aufgeführt sind), wird kein neuer Index erstellt.
  • Wenn kein nutzbarer Index vorhanden ist, wird beim Erstellen eines Fremdschlüssels auch ein Index erstellt.

Dies ist im Dokumentation beschrieben.

InnoDB erfordert Indizes für Fremdschlüssel und referenzierte Schlüssel, damit Fremdschlüsselüberprüfungen schnell durchgeführt werden können und keine Tabellenscan benötigt wird. In der referenzierenden Tabelle muss ein Index vorhanden sein, wobei die Fremdschlüsselspalten in derselben Reihenfolge als erste Spalten aufgeführt sind. Ein solcher Index wird auf der referenzierenden Tabelle automatisch erstellt, wenn er nicht vorhanden ist. (Dies steht im Gegensatz zu einigen älteren Versionen, in denen Indizes explizit erstellt werden mussten oder die Erstellung von Fremdschlüsselbeschränkungen fehlschlagen würde.) index_name wird, wenn angegeben, wie zuvor beschrieben verwendet.

3voto

Daniel Vassallo Punkte 325264

Ja, MySQL 5.1 erstellt automatisch einen Index auf der referenzierenden Tabelle, wenn Sie eine Fremdschlüssel-Einschränkung definieren. MySQL erfordert einen Index sowohl auf der referenzierenden Tabelle als auch auf der referenzierten Tabelle für Fremdschlüssel.

Beachten Sie jedoch, dass der Index automatisch nur auf der referenzierenden Tabelle erstellt wird und nicht auf der referenzierten Tabelle. MySQL wird es Ihnen nicht erlauben, einen Fremdschlüssel zu erstellen, der auf ein Feld in der referenzierten Tabelle verweist, das keinen Index verwenden kann:

CREATE TABLE orders (
  id int PRIMARY KEY,
  code int,
  name varchar(10)
) ENGINE=INNODB;

CREATE TABLE order_details (
  detail_id int PRIMARY KEY,
  order_code int,
  value int,
  FOREIGN KEY (order_code) REFERENCES orders(code)
) ENGINE=INNODB;

ERROR 1005 (HY000): Kann Tabelle 'test.order_details' nicht erstellen

Dies ist nicht sehr häufig, da Sie oft Fremdschlüssel-Einschränkungen erstellen würden, die auf den Primärschlüssel der referenzierten Tabelle verweisen, und Primärschlüssel automatisch indiziert sind. Es ist jedoch wahrscheinlich sinnvoll, dies im Hinterkopf zu behalten.

Das Erstellen eines Index auf dem code-Feld der orders-Tabelle würde das Problem lösen:

CREATE INDEX ix_orders_code ON orders(code);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X