Réponses:
Oui, mais uniquement sur innodb. Innodb est actuellement le seul format de table livré avec des clés étrangères implémentées.
Apparemment, un index est créé automatiquement comme spécifié dans le lien que Robert a publié .
InnoDB nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications de clés étrangères puissent être rapides et ne nécessitent pas une analyse de table. Dans la table de référence, il doit y avoir un index dans lequel les colonnes de clé étrangère sont répertoriées en tant que premières colonnes dans le même ordre. Un tel index est créé automatiquement sur la table de référencement s'il n'existe pas. (Cela contraste avec certaines versions plus anciennes, dans lesquelles les index devaient être créés explicitement ou la création de contraintes de clé étrangère échouait.) Nom_index, s'il est indiqué, est utilisé comme décrit précédemment.
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.
Oui, voir InnoDB et FOREIGN KEY Constraints .
Vous n'obtenez pas l'index automatiquement si vous faites une ALTER TABLE (au lieu de CREATE TABLE), au moins selon les documents (le lien est pour 5.1 mais c'est la même chose pour 5.5):
[...] Lorsque vous ajoutez une contrainte de clé étrangère à une table à l'aide de ALTER TABLE, n'oubliez pas de créer d'abord les index requis.
Pour ceux qui recherchent des devis de 5.7
documents :
MySQL nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications de clés étrangères puissent être rapides et ne nécessitent pas une analyse de table. Dans la table de référence, il doit y avoir un index dans lequel les colonnes de clé étrangère sont répertoriées en tant que premières colonnes dans le même ordre. Un tel index est créé automatiquement sur la table de référencement s'il n'existe pas. Cet index peut être supprimé silencieusement ultérieurement, si vous créez un autre index qui peut être utilisé pour appliquer la contrainte de clé étrangère. nom_index, s'il est donné, est utilisé comme décrit précédemment.
Comme indiqué, c'est le cas pour InnoDB. Au début, je pensais que c'était étrange que beaucoup d'autres (en particulier MS SQL et DB2) ne le fassent pas. Les analyses TableSpace ne sont meilleures que les analyses d'index lorsqu'il y a très peu de lignes de table - donc dans la grande majorité des cas, une clé étrangère voudrait être indexée. Ensuite, cela m'a frappé - cela ne signifie pas nécessairement qu'il doit s'agir d'un index autonome (une colonne) - où il se trouve dans l'index FK automatique de MySQL. Donc, c'est peut-être la raison pour laquelle MS SQL, DB2 (Oracle, je ne suis pas sûr), etc., laissent le DBA; après tout, plusieurs index sur de grandes tables peuvent entraîner des problèmes de performances et d'espace.
Oui, Innodb
fournissez ceci. Vous pouvez mettre un nom de clé étrangère après la FOREIGN KEY
clause ou le laisser pour laisser MySQL créer un nom pour vous. MySQL crée automatiquement un index avec le foreign_key_name
nom.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
Il n'est pas possible d'obtenir automatiquement la clé d'index
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Nom du tableau que vous avez créé par exemple des photographies et CLÉ ÉTRANGÈRE par exemple photograph_id
. Le code devrait être comme ceci
ALTER TABLE photographs ADD INDEX (photograph_id);