Odpowiedzi:
Tak, ale tylko na innodb. Innodb jest obecnie jedynym dostarczonym formatem tabeli z zaimplementowanymi kluczami obcymi.
Najwyraźniej indeks jest tworzony automatycznie, jak określono w opublikowanym przez Roberta linku .
InnoDB wymaga indeksów kluczy obcych i kluczy referencyjnych, aby sprawdzanie kluczy obcych było szybkie i nie wymagało skanowania tabeli. W tabeli odwołań musi istnieć indeks, w którym kolumny klucza obcego są wymienione jako pierwsze kolumny w tej samej kolejności. Taki indeks jest tworzony automatycznie w tabeli odwołań, jeśli nie istnieje. (Jest to sprzeczne z niektórymi starszymi wersjami, w których indeksy musiały być tworzone jawnie lub tworzenie ograniczeń klucza obcego nie powiodło się.) Nazwa indeksu, jeśli podano, jest używana jak opisano wcześniej.
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Tak, zobacz Ograniczenia InnoDB i ZAGRANICZNE .
Nie otrzymujesz indeksu automatycznie, jeśli wykonasz ALTER TABLE (zamiast CREATE TABLE), przynajmniej zgodnie z dokumentacją (link jest dla 5.1, ale jest taki sam dla 5.5):
[...] Kiedy dodajesz ograniczenie klucza obcego do tabeli za pomocą ALTER TABLE, pamiętaj, aby najpierw utworzyć wymagane indeksy.
Dla tych, którzy szukają cytatów z 5.7
dokumentów :
MySQL wymaga indeksów kluczy obcych i kluczy referencyjnych, aby sprawdzanie kluczy obcych było szybkie i nie wymagało skanowania tabeli. W tabeli odwołań musi istnieć indeks, w którym kolumny klucza obcego są wymienione jako pierwsze kolumny w tej samej kolejności. Taki indeks jest tworzony automatycznie w tabeli odwołań, jeśli nie istnieje. Ten indeks może zostać po cichu usunięty później, jeśli utworzysz inny indeks, którego można użyć do wymuszenia ograniczenia klucza obcego. nazwa_indeksu, jeśli jest podana, jest używana jak opisano wcześniej.
Jak stwierdzono, dotyczy to InnoDB. Na początku myślałem, że to dziwne, że wiele innych (w szczególności MS SQL i DB2) tego nie robi. Skany TableSpace są lepsze niż skany indeksowe tylko wtedy, gdy jest bardzo mało wierszy tabeli - tak więc w zdecydowanej większości przypadków klucz obcy chciałby być indeksowany. W pewnym sensie mnie to uderzyło - niekoniecznie musi to oznaczać, że musi to być samodzielny indeks (z jedną kolumną) - gdzie znajduje się w automatycznym indeksie FK MySQL. Być może dlatego MS SQL, DB2 (Oracle nie jestem pewien) itd. Pozostawiają to DBA; w końcu wiele indeksów na dużych tabelach może powodować problemy z wydajnością i przestrzenią.
Tak, Innodb
podaj to. Możesz wstawić nazwę klucza obcego po FOREIGN KEY
klauzuli lub pozostawić ją, aby MySQL mógł utworzyć dla ciebie nazwę. MySQL automatycznie tworzy indeks o foreign_key_name
nazwie.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action