Codice di errore: 1005. Impossibile creare la tabella "..." (errno: 150)


103

Ho cercato una soluzione a questo problema su Internet e ho controllato le domande di Stack Overflow, ma nessuna delle soluzioni ha funzionato per il mio caso.

Voglio creare una chiave esterna dalla tabella sira_no a metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Questo script restituisce:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Ho provato ad aggiungere un indice alla tabella di riferimento:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Ho controllato METAL_KODU su entrambe le tabelle (set di caratteri e regole di confronto), ma non sono riuscito a trovare una soluzione a questo problema. Come posso risolvere questo problema?

Ecco il tavolo metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

Puoi mostrare lo schema per la metal_kodtabella ... quale campo in quella tabella dovrebbe fare riferimento alla chiave esterna?
Manse

Risposte:


271

Codice errore: 1005 - nel codice è presente un riferimento di chiave primaria errato

Di solito è dovuto a un campo di chiave esterna referenziato che non esiste. Potrebbe essere che tu abbia un errore di battitura, o controllare che dovrebbe essere lo stesso, o c'è una mancata corrispondenza del tipo di campo. I campi collegati a chiave esterna devono corrispondere esattamente alle definizioni.

Alcune cause note possono essere:

  1. Il tipo e / o la dimensione dei due campi chiave non corrispondono esattamente. Ad esempio, se uno è INT(10)il campo chiave deve essere lo INT(10)stesso e non INT(11)o TINYINT. Si consiglia di confermare la dimensione del campo utilizzando SHOW CREATE TABLEperché il browser delle query a volte verrà visualizzato visivamente solo INTEGERper entrambi INT(10)e INT(11). Dovresti anche controllare che uno non lo sia SIGNEDe l'altro lo sia UNSIGNED. Entrambi devono essere esattamente uguali.
  2. Uno dei campi chiave a cui stai tentando di fare riferimento non ha un indice e / o non è una chiave primaria. Se uno dei campi nella relazione non è una chiave primaria, è necessario creare un indice per quel campo.
  3. Il nome della chiave esterna è un duplicato di una chiave già esistente. Verifica che il nome della tua chiave esterna sia univoco all'interno del tuo database. Aggiungi solo alcuni caratteri casuali alla fine del nome della tua chiave per verificarlo.
  4. Uno o entrambi i tuoi tavoli sono un MyISAMtavolo. Per poter utilizzare chiavi esterne, le tabelle devono essere entrambe InnoDB. (In realtà, se entrambe le tabelle sono MyISAM, non riceverai un messaggio di errore, semplicemente non creerà la chiave.) Nel browser delle query, puoi specificare il tipo di tabella.
  5. Hai specificato una cascata ON DELETE SET NULL, ma il campo chiave pertinente è impostato su NOT NULL. Puoi risolvere questo problema modificando la cascata o impostando il campo per consentire i NULLvalori.
  6. Assicurati che le opzioni Set di caratteri e Fascicola siano le stesse sia a livello di tabella che a livello di singolo campo per le colonne chiave.
  7. Hai un valore predefinito (ovvero, default = 0) nella colonna della chiave esterna
  8. Uno dei campi nella relazione fa parte di una chiave combinata (composta) e non dispone di un proprio indice individuale. Anche se il campo ha un indice come parte della chiave composta, è necessario creare un indice separato solo per quel campo chiave per poterlo utilizzare in un vincolo.
  9. Hai un errore di sintassi nella tua ALTERdichiarazione o hai digitato male uno dei nomi dei campi nella relazione
  10. Il nome della tua chiave esterna supera la lunghezza massima di 64 caratteri.

Per maggiori dettagli, fare riferimento a: MySQL Error Number 1005 Impossibile creare la tabella


4
il problema era che i set di caratteri della chiave esterna non corrispondevano. Grazie per la risposta.
lamostreta

4
SHOW ENGINE INNODB STATUScome menzionato in questa domanda mi ha aiutato a diagnosticare il mio problema particolare (PEBCAK, nel mio caso ...)
Hobo

1
accidenti, anche se è una chiave primaria. Devi creare un indice individuale per quella chiave. grazie questo ha risolto il mio problema.
RSB

3
# 4 era il mio problema: una delle tabelle era MyISAM e lo script ha cercato di creare una tabella InnoDB. Mi sono imbattuto in questo problema quando stavo cercando di distribuire un vecchio sistema che inizialmente eseguiva MySQL 5.0 o una versione simile, in cui il motore di archiviazione predefinito era MyISAM e gli script funzionavano correttamente. Il mio ambiente attuale è 5.5 e l'archiviazione predefinita è InnoDB. L'aggiunta set names 'utf8', storage_engine=MYISAM;all'inizio dello script ha risolto il problema per me. Grazie @ user319198 e @Stefano per l'elaborata risposta! : o)
Boris Chervenkov

1
Al mio mancava l'attributo "non firmato" come menzionato in # 1, grazie!
helvete

11

Ciò potrebbe accadere anche quando si esporta il database da un server a un altro e le tabelle sono elencate in ordine alfabetico per impostazione predefinita.
Quindi, la tua prima tabella potrebbe avere una chiave esterna di un'altra tabella che deve ancora essere creata. In questi casi, disabilitare foreign_key_checks e creare il database.

Basta aggiungere quanto segue al tuo script:

SET FOREIGN_KEY_CHECKS=0;

e funzionerà.


4

Molto spesso accade quando la chiave esterna e la chiave di riferimento non hanno lo stesso tipo o la stessa lunghezza.


4

A volte è dovuto al fatto che la tabella master viene eliminata (forse disabilitando foreign_key_checks), ma la chiave esterna CONSTRAINT esiste ancora in altre tabelle. Nel mio caso avevo lasciato cadere la tabella e ho provato a ricrearla, ma per me stava lanciando lo stesso errore.

Quindi prova a eliminare tutti i CONSTRAINT della chiave esterna da tutte le tabelle se ce ne sono e quindi aggiorna o crea la tabella.


2

Ho avuto un errore simile. Il problema aveva a che fare con la tabella figlio e padre che non avevano lo stesso set di caratteri e regole di confronto. Questo può essere risolto aggiungendo ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... sull'istruzione SQL significa che manca del codice.


2

La chiave esterna deve avere lo stesso tipo della chiave primaria a cui fa riferimento. Per l'esempio ha il tipo "INT UNSIGNED NOT NULL" anche la chiave esterna deve essere "INT UNSIGNED NOT NULL"

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';

non firmato era il problema per me. Grazie!
Gabo

2

Codice errore: 1005

Ho avuto un problema simile, quindi ecco alcune cose che ho provato (non in qualsiasi ordine, ad eccezione della soluzione :))

  1. Modificati i nomi delle chiavi esterne (non ha funzionato)
  2. Ridotta la lunghezza della chiave esterna
  3. Verificato i tipi di dati (dannazione, niente di sbagliato)
  4. Controlla gli indici
  5. Controlla le regole di confronto (tutto bene, maledizione di nuovo)
  6. Troncato il tavolo, inutile
  7. Abbandonato il tavolo e ricreato
  8. Ho provato a vedere se viene creato un riferimento circolare --- tutto bene
  9. Alla fine, ho visto che avevo due editor aperti. Uno che in PhpStorm (JetBrains) e l'altro workbench MySQL. Sembra che PhpStorm / MySQL Workbench crei una sorta di blocco delle modifiche.

    Ho chiuso PhpStorm solo per verificare se il blocco era il caso (avrebbe potuto essere il contrario). Questo ha risolto il mio problema.


2

Ho ricevuto lo stesso messaggio di errore. Alla fine ho capito di aver sbagliato a scrivere il nome della tabella nel comando:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

contro

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Mi chiedo perché mai MySQL non può dire che una tabella del genere non esiste ...


1

MyISAM è stato appena menzionato. Prova semplicemente ad aggiungere ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; alla fine di un'istruzione, assumendo che le altre tabelle siano state create con MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

1

Nel mio caso, è successo quando una tabella è InnoB e l'altra è MyISAM. Cambiare motore di una tabella, tramite MySQL Workbench, risolve per me.


1

È successo nel mio caso, perché il nome della tabella a cui si fa riferimento nella dichiarazione del vincolo non era corretto (ho dimenticato le maiuscole nel nome della tabella):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

1

controlla che entrambe le tabelle abbiano lo stesso schema InnoDB MyISAM. Li ho fatti tutti uguali nel mio caso InnoDB e ho lavorato


1

Il mio problema non era elencato, era qualcosa di così stupido ..... La tabella che ha FKcome PK era un composto PKche è stato dichiarato in questo modo: chiave primaria ( CNPJ, CEP) Volevo che il campo CEP fosse FKin un'altra tabella e lo ero bloccato in questo errore, la morale della storia ha appena invertito il codice sopra per la chiave primaria ( CEP, CNPJ) e ha funzionato. Ricevi la mancia ai loro amici.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.