Risposte:
Sì, ma solo su InnoDB. Innodb è attualmente l'unico formato di tabella fornito con chiavi esterne implementate.
Apparentemente un indice viene creato automaticamente come specificato nel link che Robert ha pubblicato .
InnoDB richiede indici su chiavi esterne e chiavi di riferimento in modo che i controlli delle chiavi esterne possano essere veloci e non richiedere una scansione della tabella. Nella tabella di riferimento, deve esserci un indice in cui le colonne della chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente nella tabella di riferimento se non esiste. (Ciò è in contrasto con alcune versioni precedenti, in cui gli indici dovevano essere creati in modo esplicito o la creazione di vincoli di chiave esterna avrebbe avuto esito negativo.) Nome_indice, se fornito, viene utilizzato come descritto in precedenza.
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.
Sì, vedi Vincoli di InnoDB e FOREIGN KEY .
Non si ottiene automaticamente l'indice se si esegue ALTER TABLE (anziché CREATE TABLE), almeno in base ai documenti (il collegamento è per 5.1 ma è lo stesso per 5.5):
[...] Quando aggiungi un vincolo di chiave esterna a una tabella utilizzando ALTER TABLE, ricordati di creare prima gli indici richiesti.
Per coloro che sono alla ricerca di un preventivo da 5.7
documenti :
MySQL richiede indici su chiavi esterne e chiavi di riferimento in modo che i controlli delle chiavi esterne possano essere veloci e non richiedere una scansione della tabella. Nella tabella di riferimento, deve esserci un indice in cui le colonne della chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente nella tabella di riferimento se non esiste. Questo indice potrebbe essere eliminato silenziosamente in seguito, se si crea un altro indice che può essere utilizzato per imporre il vincolo di chiave esterna. index_name, se fornito, viene utilizzato come descritto in precedenza.
Come detto, per InnoDB. All'inizio ho pensato che fosse strano che molti altri (in particolare MS SQL e DB2) non lo facessero. Le scansioni di TableSpace sono migliori delle scansioni dell'indice solo in presenza di pochissime righe di tabelle, quindi per la maggior parte dei casi una chiave esterna vorrebbe essere indicizzata. Quindi mi ha colpito - questo non significa necessariamente che debba essere un indice indipendente (una colonna) - dove si trova nell'indice FK automatico di MySQL. Quindi, potrebbe essere questo il motivo per cui MS SQL, DB2 (Oracle non ne sono sicuro) ecc. Lasciano al DBA; dopo che tutti gli indici multipli su tabelle di grandi dimensioni possono causare problemi con prestazioni e spazio.
Sì, Innodb
forniscilo. Puoi inserire un nome chiave esterna dopo la FOREIGN KEY
clausola o lasciarlo per consentire a MySQL di creare un nome per te. MySQL crea automaticamente un indice con il foreign_key_name
nome.
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
Non è possibile ottenere automaticamente la chiave indice
ALTER TABLE (NAME OF THE TABLE) ADD INDEX (FOREIGN KEY)
Nome della tabella creata ad esempio fotografie e CHIAVE ESTERA ad esempio photograph_id
. Il codice dovrebbe essere così
ALTER TABLE photographs ADD INDEX (photograph_id);