Cum să remediați eroarea de constrângere a cheii externe MySQL nu poate adăuga?

Publicat: 2022-12-22

Cum remediați eroarea „ MySQL Cannot Add Foreign Key Constraint ”? Este posibil să primiți următorul mesaj de eroare atunci când încercați să adăugați o constrângere de cheie străină la un tabel MySQL: „ EROARE 1215 (HY000): Nu se poate adăuga constrângere de cheie străină ”.

O eroare ca aceasta este foarte generală și nu oferă detalii specifice cu privire la motivul specific pentru care MySQL nu poate introduce o constrângere de cheie străină într-un tabel. Pentru a rezolva această problemă, va trebui să identificați cauza exactă a problemei.

Acest articol va explica motivul erorii MySQL „#1215 – Cannot Add Foreign Key Constraint”, cum să găsiți motivul și cum să o remediați cu patru metode eficiente.

Cum să remediați eroarea de constrângere a cheii externe MySQL nu poate adăuga?

Care este motivul pentru eroarea MySQL „#1215 – Nu se poate adăuga constrângere cheie străină”?

Această eroare poate avea o varietate de cauze. Pentru a determina cauza acestei erori, cel mai bine este să examinați secțiunea ULTIMA EROARE CHEIE străină din SHOW ENGINE INNODB STATUS.

În acest fel, veți obține o mai bună înțelegere a problemei. Veți putea identifica cazul dvs. din următoarea listă:

De obicei, la încărcarea depozitelor, tabelul sau indexul la care se referă constrângerea nu există

Uneori, clienții tabelului bazei de date doresc să adauge constrângeri nu există, rezultând un mesaj de eroare 1215.

Cu toate acestea, nu există nicio indicație că tabelul nu există, așa că este recomandat să utilizați comanda pentru a determina ce tabele sunt disponibile în baza de date.

Rulați SHOW TABLES sau SHOW CREATE TABLE pe fiecare dintre tabelele părinte. Orice tabel care returnează o eroare 1146 indică faptul că tabelele au fost create în ordine incorectă.

Soluția este să rulați CREATE TABLE care lipsește și să încercați din nou sau să dezactivați temporar verificările cheii străine. Este esențial să efectuați acest pas în timpul restaurărilor de rezervă în care pot fi prezente referințe circulare.

Rulați următorul cod pentru a remedia eroarea:

 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;

Tabelele sau indecșii din referințele de constrângere folosesc greșit ghilimele

Dacă doriți să diagnosticați această eroare, inspectați fiecare declarație FOREIGN KEY și asigurați-vă că nu există ghilimele în jurul calificatorilor de obiect sau că există ghilimele în jurul tabelului și o pereche în jurul numelui fiecărei coloane.

Acest lucru poate fi rezolvat fie necotând nimic, fie citând separat tabelul și coloana.

Cheia locală, tabelul străin sau coloana din referințele de constrângere are o greșeală de tipar

Este posibil să diagnosticați această eroare rulând SHOW TABLES și SHOW COLUMNS și comparând șirurile de caractere cu cele specificate în declarația dvs. REFERENCES. Greșeala de tipar trebuie corectată imediat ce este descoperită.

Coloana la care se referă constrângerea nu este de același tip sau lățime ca coloana străină

Pentru diagnostic, utilizați părintele SHOW CREATE TABLE pentru a vă asigura că coloana locală și coloana la care se face referire conțin același tip de date și lățime.

Problema poate fi rezolvată prin editarea instrucțiunii DDL pentru a vă asigura că definiția coloanei din tabelul copil se potrivește cu cea din tabelul părinte.

Obiectul străin nu este o CHEIE de niciun fel

Pentru a diagnostica această problemă, utilizați părintele SHOW CREATE TABLE pentru a examina partea REFERENȚE a tabelului pentru a vă asigura că coloana care indică către aceasta nu este indexată.

Remediați problema făcând coloana fie o CHEIE, CHEIE UNICĂ sau CHEIE PRIMARĂ.

Cheia externă este un PK sau UK cu mai multe coloane, unde coloana la care se face referire nu este cea din stânga

Pentru a diagnostica această eroare, executați comanda părinte SHOW CREATE TABLE pentru a determina dacă partea REFERENȚE indică o coloană care este prezentă în unii indecși cu mai multe coloane, dar nu este cea mai din stânga în definiția sa.

Puteți rezolva problema adăugând un index la tabelul părinte, unde coloana la care se face referire este cea din stânga sau singura coloană.

Seturi de caractere/colații diferite între cele două tabele/coloane

Pentru a diagnostica problema, rulați SHOW CREATE TABLE parent și verificați dacă părțile CHARACTER SET și COLLATE ale coloanei secundare se potrivesc cu cele din tabelul părinte.

Pentru a remedia acest lucru, asigurați-vă că tabelul copil DDL se potrivește cu setul de caractere și colaţionarea tabelului/coloanei sale părinte sau ALTERAȚI tabelul părinte astfel încât definiția sa să se potrivească cu definiția copilului.

Tabelul părinte nu utilizează InnoDB

Problema poate fi diagnosticată rulând SHOW CREATE TABLE parent și verificând ENGINE=INNODB.

ALTERAȚI tabelul părinte pentru a comuta de la MySQL la InnoDB pentru a rezolva această problemă.

Cum să găsiți motivul pentru eroarea „Nu se poate adăuga constrângere cheie străină”?

Această eroare nu indică motivul specific pentru incapacitatea MySQL de a implementa o constrângere de cheie străină pe tabel, ceea ce este foarte general.

Pentru a ajuta la rezolvarea acestei probleme, va trebui să identificați cauza exactă. Puteți face acest lucru rulând următoarea interogare în clientul dvs. MySQL:

 SHOW ENGINE INNODB STATUS;

Trei câmpuri trebuie returnate din această interogare: Tip, Nume și Stare. Cea mai ULTIMA EROARE CHEIE străină poate fi identificată prin extinderea coloanei de stare a rezultatului.

Această secțiune își propune să identifice de ce ultima interogare de modificare a eșuat, astfel încât să puteți remedia problema.

De obicei, există o nepotrivire între tipul coloanelor din tabelul primar și tabelul străin ca cauză a acestei probleme.

Problema poate fi cauzată și de o nepotrivire între tipurile de motoare a două tabele, cum ar fi MyISAM și InnoDB.

Este posibil, de asemenea, datorită colării diferite dintre tabele, unul folosind UTF-8, iar celălalt folosind latin1.

Ar trebui să acordați atenție următorilor factori:

Motor : Fiecare tabel ar trebui să fie configurat cu același motor de bază de date, de exemplu, InnoDB.

Tip de date: într-un tabel, ambele coloane ar trebui să aibă același tip de datatype. int(11) datatype. int(11) „, în timp ce, în altul, smallint(5) va cauza o problemă.

Colaţionare : Pentru a asigura compatibilitatea, ambele seturi de caractere de coloane ar trebui să fie aceleaşi, de exemplu, UTF8.

Atenție : coloanele ar putea avea încă una diferită, chiar dacă tabelele dvs. au aceeași colație.

Unic : cheile externe ar trebui să se refere la câmpuri unice din tabelul de referință, de obicei la cele primare.

Ungisned : Este posibil ca un tabel să aibă chei nesemnate, iar altul să nu aibă chei nesemnate.

Cum se remediază eroarea MySQL „#1215 – Nu se poate adăuga constrângere cheie străină” (4 metode)?

După ce am discutat despre diferitele cauze ale acestui mesaj de eroare, am trecut la pasul următor. Această eroare trebuie remediată, așa că haideți să vedem cum se face cu patru metode eficiente.

Metoda 1: Verificați disponibilitatea mesei

Pentru a începe depanarea erorii, puteți verifica dacă tabelul există rulând următoarea comandă:

 show tables;

Din acest cod este evident că constrângerea ar putea fi creată deoarece tabelul era disponibil.

Metoda 2: Asigurați-vă că tabelul părinte utilizează InnoDB

Investigații suplimentare ar putea fi efectuate prin verificarea motorului de stocare setat la tabelul bazei de date. Următoarea comandă poate fi folosită pentru a face acest lucru:

 SHOW CREATE TABLE parent

Rezultatul este că veți descoperi că InnoDB nu este motorul de stocare. Deoarece a fost setat ENGINE=MYISAM, puteți schimba motorul de stocare rulând următoarea comandă:

 ALTER TABLE parent ENGINE=INNODB;

În sfârșit, este posibil să remediați eroarea cu această metodă.

Metoda 3: Verificați dacă există citate nepotrivite

Pentru fiecare declarație FOREIGN KEY, asigurați-vă că nu sunt introduse ghilimele în jurul calificatorilor de obiect sau că ghilimele separate înconjoară numele tabelului și al coloanei.

Cu această metodă, este necesar fie să nu citați nimic, fie să citați separat coloana și tabelul pentru a remedia eroarea.

Metoda 4: Verificarea dacă cheia există sau nu

Când introduceți comenzi MySQL, este necesar să vă asigurați că este introdusă comanda corectă. Verificarea încrucișată asigură că clientul nu face referire la o cheie de tabel inexistentă în tabelul țintă.

Prin urmare, este necesar să corectați clienții cu privire la modul de utilizare a cheii de pe masă. Este posibil ca coloana utilizată pentru ON DELETE SET NULL să nu aibă o definiție nulă în unele cazuri.

Pentru a preveni eroarea MySQL 1215, trebuie să vă asigurați că coloana este setată la valoarea nulă implicită.

Concluzie

Acest articol a explicat motivul erorii MySQL „#1215 – Cannot Add Foreign Key Constraint”, cum să găsiți cauza și cum să o remediați cu patru metode eficiente.

Vă mulțumim pentru timpul acordat pentru a revizui acest articol. Ne face plăcere să vi-l prezentăm. În secțiunea de comentarii, vă rugăm să postați orice întrebări sau comentarii.

Vă rugăm să apreciați și să urmăriți paginile noastre de Facebook și Twitter dacă doriți să fiți la curent cu ultimele știri.