La definizione di una chiave esterna definisce anche un indice? Ho mysql v5.1.46 & Sto guardando lo strumento di amministrazione di MySQL e il suo mostra la chiave esterna come un indice, quindi volevo confermare?Domanda chiave esterna MySQL
risposta
Sì, MySQL 5.1 crea automaticamente un indice sulla tabella di riferimento quando si definisce un vincolo di chiave esterna. MySQL richiede un indice sia sulla tabella di riferimento che sulla tabella di riferimento per le chiavi esterne.
Si noti tuttavia che l'indice viene creato automaticamente solo nella tabella di riferimento e non nella tabella di riferimento. MySQL non vi permetterà di creare una chiave esterna che fa riferimento a un campo nella tabella di riferimento che non può utilizzare un indice:
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): Can't create table 'test.order_details'
Questo non è molto comune, dal momento che si sarebbe spesso essere la creazione di vincoli di chiave esterna che fanno riferimento la chiave primaria della tabella di riferimento e le chiavi primarie sono indicizzate automaticamente. Tuttavia, probabilmente vale la pena tenerlo a mente.
Creare un indice sul code
campo della tabella orders
risolverebbe il problema:
CREATE INDEX ix_orders_code ON orders(code);
- Se esiste già un indice utilizzabile (un indice in cui le colonne chiave esterna sono elencati come prime colonne nello stesso ordine) non viene creato un nuovo indice.
- Se non esiste un indice utilizzabile, la creazione di una chiave esterna crea anche un indice.
Questo è indicato nello documentation.
InnoDB richiede indici su chiavi esterne e chiavi di riferimento in modo che i controlli di chiavi esterne possano essere veloci e non richiedere una scansione di tabella. Nella tabella di riferimento, deve esistere un indice in cui le colonne chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente sulla tabella di riferimento se non esiste. (Ciò è in contrasto con alcune versioni precedenti, in cui gli indici dovevano essere creati esplicitamente o la creazione di vincoli di chiavi esterne non sarebbe riuscita.) Index_name, se specificato, viene usato come descritto in precedenza.
Corretto collegamento obsoleto alla documentazione. –