Errore MySQL 1215: imansible aggiungere un vincolo di chiave esterna

Sto cercando di inoltrare il mio nuovo schema al mio server db, ma non riesco a capire perché sto ricevendo questo errore. Ho cercato di cercare la risposta qui, ma tutto quello che ho trovato ha detto di impostare il motore db su Innodb o per assicurarmi che le chiavi che sto cercando di usare come chiave esterna siano chiavi primarie nelle loro tabelle . Ho fatto entrambe queste cose, se non mi sbaglio. Qualche altro aiuto che voi ragazzi potreste offrire?

Executing SQL script in server ERROR: Error 1215: Cannot add foreign key constraint -- ----------------------------------------------------- -- Table `Alternative_Pathways`.`Clients_has_Staff` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` ( `Clients_Case_Number` INT NOT NULL , `Staff_Emp_ID` INT NOT NULL , PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) , INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) , INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) , CONSTRAINT `fk_Clients_has_Staff_Clients` FOREIGN KEY (`Clients_Case_Number` ) REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_Clients_has_Staff_Staff1` FOREIGN KEY (`Staff_Emp_ID` ) REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB 

Esecuzione script SQL terminata: istruzioni: 7 riuscito, 1 non riuscito

Ecco l’SQL per le tabelle padre.

 CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` ( `Case_Number` INT NOT NULL , `First_Name` CHAR(10) NULL , `Middle_Name` CHAR(10) NULL , `Last_Name` CHAR(10) NULL , `Address` CHAR(50) NULL , `Phone_Number` INT(10) NULL , PRIMARY KEY (`Case_Number`) ) ENGINE = InnoDB CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` ( `Emp_ID` INT NOT NULL , `First_Name` CHAR(10) NULL , `Middle_Name` CHAR(10) NULL , `Last_Name` CHAR(10) NULL , PRIMARY KEY (`Emp_ID`) ) ENGINE = InnoDB 

Sto indovinando che Clients.Case_Number e / o Staff.Emp_ID non sono esattamente lo stesso tipo di dati di Clients_has_Staff.Clients_Case_Number e Clients_has_Staff.Staff_Emp_ID .

Forse le colonne nelle tabelle padre sono INT UNSIGNED ?

Devono essere esattamente lo stesso tipo di dati in entrambe le tabelle.

Motivi per cui potresti ricevere un errore di vincolo di chiave esterna:

  1. Non si utilizza InnoDB come motore su tutti i tavoli.
  2. Stai provando a fare riferimento a una chiave inesistente sulla tabella di destinazione. Assicurati che sia una chiave sull’altra tabella (può essere una chiave primaria o unica)
  3. I tipi di colonne non sono gli stessi (eccezione è la colonna sulla tabella di riferimento può essere nullable).
  4. Se il PK / FK è un varchar assicurati che la collazione sia la stessa per entrambi.

Aggiornare:

  1. Uno dei motivi potrebbe anche essere che la colonna che si sta utilizzando per ON DELETE SET NULL non è definita come null. Quindi assicurati che la colonna sia impostata come predefinita null.

Controlla questi.

Per gli altri lo stesso errore potrebbe non essere sempre dovuto alla mancata corrispondenza del tipo di colonna, è ansible trovare ulteriori informazioni su un errore chiave mysql foriegn emettendo un comando

 SHOW ENGINE INNODB STATUS; 

potresti trovare un errore nella parte superiore del messaggio stampato qualcosa del genere

Imansible trovare un indice nella tabella di riferimento in cui le colonne di riferimento vengono visualizzate come prime colonne o tipi di colonna nella tabella e la tabella di riferimento non corrisponde per il vincolo.

L’errore 1215 è fastidioso. La risposta di Explosion Pill copre le basi. Vuoi assicurarti di iniziare da lì. Tuttavia, ci sono altri casi molto più sottili da tenere in considerazione:

Ad esempio, quando si tenta di colbind i tasti PRIMARY di diverse tabelle, assicurarsi di fornire le opzioni ON UPDATE e ON DELETE corrette. Per esempio:

 ... PRIMARY KEY (`id`), FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL .... 

non volerà, perché i tasti PRIMARY (come id ) non possono essere NULL .

Sono sicuro che ci sono ancora più problemi altrettanto sottili quando si aggiungono questi tipi di vincoli, motivo per cui quando si verificano errori di vincoli, assicurarsi sempre che i vincoli e le loro implicazioni abbiano senso nel contesto corrente. Buona fortuna con il tuo errore 1215!

Nel mio caso, avevo cancellato una tabella usando SET FOREIGN_KEY_CHECKS=0 , quindi SET FOREIGN_KEY_CHECKS=1 dopo. Quando sono andato a ricaricare il tavolo, ho ricevuto l’ error 1215 . Il problema era che c’era un’altra tabella nel database che aveva una chiave esterna alla tabella che avevo cancellato e che stava ricaricando. Parte del processo di ricarica comportava la modifica di un tipo di dati per uno dei campi, che rendeva invalida la chiave esterna dall’altra tabella, innescando quindi l’ error 1215 . Ho risolto il problema eliminando e ricaricando l’altra tabella con il nuovo tipo di dati per il campo coinvolto.

C’è un trabocchetto che ho riscontrato con “Errore 1215: imansible aggiungere un vincolo di chiave esterna” quando si utilizza Laravel 4, in particolare con Laravel 4 Generators di JeffreyWay.

In Laravel 4, è ansible utilizzare i Generatori di JeffreyWay per generare file di migrazione per creare tabelle uno per uno, il che significa che ogni file di migrazione genera una tabella. Devi essere consapevole del fatto che ogni file di migrazione viene generato con un timestamp nel nome del file, che dà ai file un ordine. L’ordine di generazione è anche l’ordine dell’operazione di migrazione quando si triggers il comando CLI Artisan “php artisan migrate”. Quindi, se un file richiede un vincolo di chiave esterna riferito a una chiave che sarà, ma non ancora, generata in un ultimo file, viene generato l’errore 1215. In tal caso, ciò che devi fare è modificare l’ordine di generazione dei file di migrazione. Genera nuovi file nell’ordine corretto, copia il contenuto, quindi elimina i vecchi file in disordine.

Controllare le regole di confronto della tabella, utilizzando SHOW TABLE STATUS è ansible controllare le informazioni sulle tabelle, incluse le regole di confronto.

Entrambe le tabelle devono avere le stesse regole di confronto.

È successo a me.

Ho avuto lo stesso errore durante il tentativo di aggiungere un fk. Nel mio caso il problema è stato causato dal PK della tabella FK, contrassegnato come non firmato.

Ho avuto lo stesso problema.
L’ho risolto facendo questo:

Ho creato la seguente riga nel
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Ho trovato questa soluzione dopo aver provato ad importare una tabella nel mio costruttore di schemi. Se funziona per te, fammi sapere!

In bocca al lupo!

Felipe Tércio

Non riesco a trovare questo errore

 CREATE TABLE RATING ( Riv_Id INT(5), Mov_Id INT(10) DEFAULT 0, Stars INT(5), Rating_date DATE, PRIMARY KEY (Riv_Id, Mov_Id), FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID) ON DELETE SET DEFAULT ON UPDATE CASCADE ) 

ho avuto lo stesso problema, la mia soluzione:

Prima:

 CREATE TABLE EMPRES ( NoFilm smallint NOT NULL PRIMARY KEY (NoFilm) FOREIGN KEY (NoFilm) REFERENCES cassettes ); 

Soluzione:

 CREATE TABLE EMPRES (NoFilm smallint NOT NULL REFERENCES cassettes, PRIMARY KEY (NoFilm) ); 

Spero sia di aiuto;)

Questo succede anche quando il tipo di colonne non è lo stesso.

per esempio se la colonna a cui si sta riferendo è UNSIGNED INT e la colonna che si riferisce è INT allora si ottiene questo errore.

Per MySQL (INNODB) … ottieni le definizioni per le colonne che vuoi colbind

 SELECT * FROM information_schema.columns WHERE TABLE_NAME IN (tb_name','referenced_table_name') AND COLUMN_NAME IN ('col_name','referenced_col_name')\G 

confrontare e verificare entrambe le definizioni di colonna

stesso COLUMN_TYPE (lunghezza), stessa COLAZIONE

potrebbe essere utile per giocare come

 set foreign_key_checks=0; ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ... set foreign_key_checks=1; 

Verifica la compatibilità della tabella. Ad esempio, se una tabella è MyISAM e l’altra è InnoDB , potresti avere questo problema.

Un altro motivo: se si utilizza ON DELETE SET NULL tutte le colonne utilizzate nella chiave esterna devono consentire valori nulli. Qualcun altro ha trovato questo in questa domanda .

Dalla mia comprensione non sarebbe un problema per quanto riguarda l’integrità dei dati, ma sembra che MySQL non supporta questa funzionalità (in 5.7).

Quando questo errore si verifica perché la tabella di riferimento utilizza il motore MyISAM, questa risposta fornisce un modo rapido per convertire il database in modo che tutte le tabelle del modello Django utilizzino InnoDB: https://stackoverflow.com/a/15389961/2950621

È un comando di gestione Django chiamato convert_to_innodb.

Per me erano i tipi di colonna. BigINT! = INT.

Ma poi non ha funzionato.

Quindi ho controllato i motori. Assicurati che Table1 = InnoDB e Table = InnoDB

Anche io ho avuto lo stesso problema. E la colpa è stata con il segnalino “non firmato” nel tavolo PK dell’FK

Wooo ho appena capito! Era un mix di molte risposte già pubblicate (innoDB, unsigned, ecc.). Una cosa che non ho visto qui però è: se il tuo FK sta puntando su un PK, assicurati che la colonna di origine abbia un valore che abbia senso. Ad esempio, se il PK è un mediumint (8), assicurati che la colonna source contenga anche un mediumint (8). Questo era parte del problema per me.

Essere consapevoli dell’uso di backquote anche. Ho avuto in una sceneggiatura la seguente dichiarazione

 ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`; 

ma le backquote alla fine erano false. Sarebbe dovuto essere:

 ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`); 

MySQL dà sfortuna nessun dettaglio su questo errore …

Ho riscontrato questo errore per una ragione completamente diversa. Ho usato MySQL Workbench 6.3 per creare il mio modello di dati (fantastico strumento). Ho notato che quando l’ordine di colonna definito nella definizione del vincolo di chiave esterna non si adatta alla sequenza di colonne della tabella, viene generato anche questo errore.

Mi ci sono voluti circa 4 ore per provare tutto il resto, ma controllandolo.

Ora tutto funziona bene e posso tornare alla codifica. 🙂

Un’altra fonte di questo errore è che si hanno 2 o più nomi di tabelle uguali con lo stesso nome di chiave esterna. Questo a volte capita a persone che usano software di modellazione e progettazione, come Mysql Workbench, e in seguito generano lo script dal design.

quando provi a creare una chiave esterna quando usi la migrazione di laravel

come questo esempio:

tabella utente

  public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->TinyInteger('color_id')->unsigned(); $table->foreign('color_id')->references('id')->on('colors'); $table->timestamps(); }); } 

tavolo colors

  public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('color'); $table->timestamps(); }); } 

a volte le proprietà non hanno funzionato

 [PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 

questo errore si è verificato perché la chiave esterna (tipo) in [tabella utente] è differita dalla chiave primaria (tipo) in [tabella colors]

Per risolvere questo problema dovrebbe cambiare la chiave primaria in [tabella colors]

$table->tinyIncrements('id');


Quando si utilizza la chiave primaria $table->Increments('id');

dovresti usare Integer come chiave esterna

  $table-> unsignedInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando si utilizza la chiave primaria $table->tinyIncrements('id');

dovresti usare unsignedTinyInteger come chiave esterna

  $table-> unsignedTinyInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando si utilizza la chiave primaria $table->smallIncrements('id');

dovresti usare unsignedSmallInteger come chiave esterna

  $table-> unsignedSmallInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando si utilizza la chiave primaria $table->mediumIncrements('id');

dovresti usare unsignedMediumInteger come chiave esterna

  $table-> unsignedMediumInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

So che sono MOLTO in ritardo per la festa, ma voglio metterlo qui in modo che sia elencato.

Oltre a tutti i consigli sopra riportati per assicurarti che i campi siano identicamente definiti, e anche i tipi di tabella hanno le stesse regole di confronto, assicurati di non commettere l’errore di rookie nel tentativo di colbind campi in cui i dati nel campo CHILD non sono già nel campo PARENT. Se si dispone di dati nel campo CHILD che non sono già stati inseriti nel campo GENITORE, ciò causerà questo errore. È un peccato che il messaggio di errore non sia un po ‘più utile.

In caso di dubbi, eseguire il backup della tabella con la chiave esterna, eliminare tutti i dati e quindi provare a creare la chiave esterna. Se hai successo, allora cosa devi fare!

In bocca al lupo.

Questa è una versione sottile di ciò che è già stato detto, ma nel mio caso, ho avuto 2 database (foo e bar). Ho creato foo prima e non mi ero reso conto che faceva riferimento a una chiave esterna in bar.baz (che non era ancora stata creata). Quando ho provato a creare bar.baz (senza alcuna chiave esterna), ho continuato a ricevere questo errore. Dopo aver guardato in giro per un po ‘ho trovato la chiave straniera in foo.

Quindi, per farla breve, se ottieni questo errore, potresti avere una chiave esterna preesistente alla tabella che si sta creando.

Ho avuto lo stesso errore una volta. Ho semplicemente riavviato il server MySQL e risolto il problema.