Come risolvere l'errore MySQL Impossibile aggiungere il vincolo di chiave esterna?

Pubblicato: 2022-12-22

Come si risolve l'errore " MySQL Cannot Add Foreign Key Constraint "? È possibile che venga visualizzato il seguente messaggio di errore quando si tenta di aggiungere un vincolo di chiave esterna a una tabella MySQL: " ERRORE 1215 (HY000): impossibile aggiungere il vincolo di chiave esterna ".

Un errore come questo è molto generico e non fornisce dettagli specifici sul motivo specifico per cui MySQL non può inserire un vincolo di chiave esterna in una tabella. Per risolvere questo problema, sarà necessario identificare la causa esatta del problema.

Questo articolo spiegherà il motivo dell'errore "#1215 - Cannot Add Foreign Key Constraint" di MySQL, come trovare il motivo e come risolverlo con quattro metodi efficaci.

Come risolvere l'errore MySQL Impossibile aggiungere il vincolo di chiave esterna?

Qual è il motivo dell'errore MySQL "#1215 - Impossibile aggiungere il vincolo di chiave esterna"?

Questo errore può avere diverse cause. Per determinare la causa di questo errore, è meglio esaminare la sezione LATEST FOREIGN KEY ERROR dello SHOW ENGINE INNODB STATUS.

In questo modo, otterrai una migliore comprensione del problema. Sarai in grado di identificare il tuo caso dal seguente elenco:

Di solito, quando si caricano i dump, la tabella o l'indice a cui fa riferimento il vincolo non esiste

A volte, la tabella del database che i clienti desiderano aggiungere vincoli non esiste, generando un messaggio di errore 1215.

Tuttavia, non vi è alcuna indicazione che la tabella non esista, quindi si consiglia di utilizzare il comando per determinare quali tabelle sono disponibili nel database.

Eseguire SHOW TABLES o SHOW CREATE TABLE su ciascuna delle tabelle padre. Qualsiasi tabella che restituisce un errore 1146 indica che le tabelle sono state create nell'ordine errato.

La soluzione è eseguire CREATE TABLE mancante e riprovare o disabilitare temporaneamente i controlli delle chiavi esterne. È essenziale eseguire questo passaggio durante i ripristini di backup in cui possono essere presenti riferimenti circolari.

Eseguire il codice seguente per correggere l'errore:

 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS=0; SOURCE /backups/mydump.sql; -- restore your backup within THIS session SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

Tabelle o indici nelle citazioni di uso improprio di riferimento di vincolo

Se desideri diagnosticare questo errore, ispeziona ogni dichiarazione FOREIGN KEY e assicurati che non vi siano virgolette intorno ai qualificatori di oggetto o che vi siano virgolette attorno alla tabella e una coppia attorno a ciascun nome di colonna.

Questo può essere risolto non citando nulla o citando la tabella e la colonna separatamente.

La chiave locale, la tabella esterna o la colonna nei riferimenti al vincolo presenta un errore di battitura

È possibile diagnosticare questo errore eseguendo SHOW TABLES e SHOW COLUMNS e confrontando le stringhe con quelle specificate nella dichiarazione REFERENCES. L'errore di battitura dovrebbe essere corretto non appena viene scoperto.

La colonna a cui fa riferimento il vincolo non è dello stesso tipo o larghezza della colonna esterna

Per la diagnosi, utilizzare l'elemento padre SHOW CREATE TABLE per assicurarsi che la colonna locale e la colonna di riferimento contengano lo stesso tipo di dati e larghezza.

Il problema può essere risolto modificando l'istruzione DDL per garantire che la definizione della colonna nella tabella figlio corrisponda a quella nella tabella padre.

L'oggetto estraneo non è una CHIAVE di alcun tipo

Per diagnosticare questo problema, utilizzare il genitore SHOW CREATE TABLE per esaminare la parte REFERENCES della tabella per assicurarsi che la colonna che punta a essa non sia indicizzata.

Risolvi il problema impostando la colonna KEY, UNIQUE KEY o PRIMARY KEY.

La chiave esterna è una chiave multicolonna PK o UK, dove la colonna di riferimento non è quella più a sinistra

Per diagnosticare questo errore, eseguire il comando principale SHOW CREATE TABLE per determinare se la parte REFERENCES punta a una colonna che è presente in alcuni indici a più colonne ma non è la più a sinistra nella sua definizione.

È possibile risolvere il problema aggiungendo un indice alla tabella padre in cui la colonna a cui si fa riferimento è la colonna più a sinistra o l'unica.

Diversi set di caratteri/collazioni tra le due tabelle/colonne

Per diagnosticare il problema, eseguire SHOW CREATE TABLE parent e verificare che le parti CHARACTER SET e COLLATE della colonna figlio corrispondano a quelle della tabella padre.

Per risolvere questo problema, assicurati che il DDL della tabella figlio corrisponda al set di caratteri e alle regole di confronto della relativa tabella/colonna padre oppure ALTER la tabella padre in modo che la sua definizione corrisponda alla definizione del figlio.

La tabella padre non utilizza InnoDB

Il problema può essere diagnosticato eseguendo SHOW CREATE TABLE parent e controllando ENGINE=INNODB.

ALTER la tabella padre per passare da MySQL a InnoDB per risolvere questo problema.

Come trovare il motivo dell'errore "Impossibile aggiungere il vincolo di chiave esterna"?

Questo errore non indica il motivo specifico per l'incapacità di MySQL di implementare un vincolo di chiave esterna sulla tabella, che è molto generico.

Per aiutare a risolvere questo problema, dovrai identificare la causa esatta. Puoi farlo eseguendo la seguente query nel tuo client MySQL:

 SHOW ENGINE INNODB STATUS;

Tre campi devono essere restituiti da questa query: Tipo, Nome e Stato. L'ULTIMO ERRORE DI CHIAVE FOREIGN può essere identificato espandendo la colonna dello stato del risultato.

Questa sezione ha lo scopo di identificare il motivo per cui l'ultima query di modifica non è riuscita in modo da poter risolvere il problema.

Di solito c'è una mancata corrispondenza tra il tipo di colonne nella tabella primaria e la tabella esterna come causa di questo problema.

Il problema può anche essere causato da una mancata corrispondenza tra i tipi di motore di due tabelle, come MyISAM e InnoDB.

È anche possibile a causa delle diverse regole di confronto tra le tabelle, una che utilizza UTF-8 e l'altra che utilizza latin1.

Dovresti prestare attenzione ai seguenti fattori:

Motore : ogni tabella deve essere configurata con lo stesso motore di database, ad esempio InnoDB.

Tipo di dati: in una tabella, entrambe le colonne devono avere lo stesso " datatype. int(11) datatype. int(11) “, mentre, in un altro, smallint(5) causerà un problema.

Fascicolazione : per garantire la compatibilità, entrambi i set di caratteri delle colonne devono essere gli stessi, ad esempio UTF8.

Attenzione : le colonne potrebbero ancora averne una diversa, anche se le tue tabelle hanno le stesse regole di confronto.

Univoco : le chiavi esterne devono fare riferimento a campi univoci nella tabella di riferimento, in genere quelli primari.

Ungisned : è possibile che una tabella abbia chiavi non firmate e un'altra non abbia chiavi non firmate.

Come correggere l'errore MySQL "# 1215 - Impossibile aggiungere il vincolo di chiave esterna" (4 metodi)?

Dopo aver discusso le diverse cause di questo messaggio di errore, siamo passati al passaggio successivo. Questo errore deve essere corretto, quindi vediamo come farlo con quattro metodi efficaci.

Metodo 1: Verifica la disponibilità del tavolo

Per iniziare a risolvere l'errore, puoi verificare se la tabella esiste eseguendo il seguente comando:

 show tables;

È evidente da questo codice che il vincolo poteva essere creato poiché la tabella era disponibile.

Metodo 2: assicurarsi che la tabella padre utilizzi InnoDB

Ulteriori indagini potrebbero essere condotte controllando il motore di archiviazione impostato sulla tabella del database. Il seguente comando può essere utilizzato per farlo:

 SHOW CREATE TABLE parent

Il risultato è che scoprirai che InnoDB non è il motore di archiviazione. Poiché è stato impostato ENGINE=MYISAM, è possibile modificare il motore di archiviazione eseguendo il seguente comando:

 ALTER TABLE parent ENGINE=INNODB;

È finalmente possibile correggere l'errore con questo metodo.

Metodo 3: controlla se ci sono citazioni inappropriate

Per ogni dichiarazione FOREIGN KEY, assicurati che non siano inserite virgolette attorno ai qualificatori di oggetto o che virgolette separate racchiudano i nomi di tabella e colonna.

Con questo metodo, è necessario non citare nulla o citare separatamente la colonna e la tabella per correggere l'errore.

Metodo 4: verifica dell'esistenza o meno della chiave

Quando si immettono i comandi MySQL, è necessario assicurarsi che venga immesso il comando corretto. Il controllo incrociato garantisce che il cliente non faccia riferimento a una chiave di tabella inesistente nella tabella di destinazione.

Pertanto, è necessario correggere i clienti su come utilizzare la chiave sul tavolo. È possibile che la colonna in uso per ON DELETE SET NULL non abbia una definizione null in alcuni casi.

Per evitare l'errore MySQL 1215, è necessario assicurarsi che la colonna sia impostata sul valore nullo predefinito.

Conclusione

Questo articolo ha spiegato il motivo dell'errore "#1215 - Cannot Add Foreign Key Constraint" di MySQL, come trovare la causa e come risolverlo con quattro metodi efficaci.

Grazie per aver dedicato del tempo a rivedere questo articolo. È nostro piacere presentarvelo. Nella sezione commenti, si prega di inviare eventuali domande o commenti.

Metti mi piace e segui le nostre pagine Facebook e Twitter se desideri rimanere aggiornato sulle ultime novità.