2009-11-17 14 views
68

Devo creare un db con 2 tabelle in mysql ma lo script fallisce con errno 150 (problema chiave esterna). Ho ricontrollato i campi della chiave esterna per essere uguale su entrambe le tabelle e non riesco a trovare alcun errore.Mysql. Impossibile creare la tabella errno 150

Ecco lo script:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

DROP SCHEMA IF EXISTS `testdb`; 
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; 
USE `testdb`; 

DROP TABLE IF EXISTS `testdb`.`table1` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 



DROP TABLE IF EXISTS `testdb`.`table2` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `field1` VARCHAR(50) NULL , 
    `date` DATE NULL , 
    `cnt` INT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `FK_table2_table1` (`field1` ASC) , 
    CONSTRAINT `FK_table2_table1` 
    FOREIGN KEY (`field1`) 
    REFERENCES `testdb`.`table1` (`field1`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

ho provato in Windows e Ubuntu con diverse versioni di MySQL e non ha funzionato.

Qualche idea? Molte grazie.

+9

Ho anche ricevuto questo errore tentando di creare una tabella con un vincolo FK su un'altra tabella che non esisteva ancora. È un problema facile da risolvere, reso molto difficile da un messaggio di errore completamente inutile. – Cerin

+2

Per chi arriva da google, questo errore può verificarsi anche se si commette un errore di battitura sul nome della tabella della chiave esterna. –

risposta

54

table1.field1 non ha alcun indice definito su di esso.

È necessario posizionare un vincolo FOREIGN KEY su field1.

Con questo:

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    KEY ix_table1_field1 (field1), 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

Tutto dovrebbe quindi funzionare come previsto.

+5

Secondo il manuale non ha bisogno di essere UNICO. –

+0

'@Vilx:' giusto e 15 caratteri. – Quassnoi

+17

Anche se non si applica in questo caso, si otterrà lo stesso messaggio di errore se si tenta di aggiungere un vincolo di chiave esterna e su delete impostato su null per una colonna non nullable. –

13

A seconda della versione di MySQL potrebbe essere necessario creare prima un indice su table1.field1.

1

Se non funziona, provate questo:

Il nome chiave esterna è un duplicato di una chiave già esistente. Verifica che il nome della tua chiave esterna sia univoco all'interno del tuo database. Basta aggiungere alcuni caratteri casuali alla fine del nome della chiave per verificarlo.

0

Creare sempre le tabelle principale/padre, quindi creare i dettagli/tabelle figlio.

5

un'opzione (a seconda del caso) sarebbe quello di disattivare il controllo di integrità mysql:

SET FOREIGN_KEY_CHECKS = 0; 
0

Nel mio caso, un tavolo stava usando vincoli di chiave esterna su un altro tavolo che non esisteva ancora. Questo stava accadendo a causa di un grande makefile, quindi non era così ovvio come mi sarei aspettato.

0

Nel caso in cui qualcuno abbia ancora problemi con questo, ho provato tutte le soluzioni sopra (tranne SET FOREIGN_KEY_CHECKS) e non ha funzionato. Il problema era che quando si fa riferimento alla prima tabella, alcuni database sono case sensitive riguardo ai nomi delle tabelle. Penso che sia strano visto che non l'ho mai visto prima su MySQL, Oracle e ora questo è successo per me su MariaDB.

Ad esempio:

Crea una tabella se non esiste CADASTRO_MAQUINAS ( Id VARCHAR (16), Chiave primaria (Id) );

Crea una tabella se non esiste INFORMAZIONI ( Id_Maquina VARCHAR (16) NOT NULL, VINCOLO FK_infos_cadastro_maquinas chiave esterna (Id_Maquina) fa riferimento a CADASTRO_MAQUINAS (Id) );

Se provo a creare la seconda tabella utilizzando cadastro_maquinas (casi inferiori) anziché CADASTRO_MAQUINAS, riceverò questo errore.

0

Stavo usando MySQL workBench.Il problema è che non è possibile utilizzare lo stesso foreign key name, devono essere unique. Quindi se più di una tabella fa riferimento alla stessa chiave esterna, ogni volta deve essere indicato un nome unique.

50

Mentre lavoravo con MySQL Workbench e MySQL 5.5.27, ho riscontrato il problema simile. Nel mio caso il problema era con i campi di tipo INT. Erroneamente in una tabella era INT UNSIGNED e nella tabella di riferimento era INT.

+11

Questo era esattamente il mio problema. Grazie! –

6

Un altro suggerimento:

Anche quando i tipi di dati sembrano essere lo stesso - nel mio caso ha avuto entrambe le colonne VARCHAR(50) - questo non è sufficiente.

È inoltre necessario assicurarsi che entrambe le colonne abbiano lo stesso COLLATION.

8

Una delle risposte qui suggerisce di disabilitare il controllo dell'integrità della chiave esterna. Questa è una cattiva idea. Ci sono due probabili colpevoli qui: tipo

  • dati non corrispondente tra chiave primaria di riferimento e riferimenti stranieri chiave
  • Indici. Qualsiasi chiave esterna che indichi deve essere NOT NULL
+1

per me è stata una mancata corrispondenza del tipo di dati ... grazie per l'aiuto! – sbditto85

+0

L'argomento NOT NULL non si applica al mio Mysql 5.5 –

0

Ho avuto un errore simile su uno dei miei tavoli. Quando la colonna selezionata era selezionata, la collazione era diversa, il che funzionava una volta cambiate entrambe le colonne nello stesso tipo di fascicolazione.

Dopo aver letto la maggior parte della soluzione suggerita qui. Ho solo pensato che sarebbe stato utile se avessi elencato tutte le possibilità che potrebbero generare questo errore.

1, del controllo la cassa della Colonna 2, Controllare COLLATION delle Colonne 3, controllare se c'è una chiave creata in entrambe le tabelle per la colonna (Unique, Primario)

5

Ancora un altro motivo, anche se un po 'simile ad altri: mi riferivo ad un tavolo che si è rivelato avere il motore MyISAM, invece di InnoDB.

0

Nel mio caso ho ottenuto la vecchia definizione di tabella MyISAM in una delle tabelle e ovviamente non sono riuscito a creare una chiave esterna da un'altra tabella. Forse questo aiuta qualcuno.

quindi questo potrebbe accadere a causa di incongruenze tra due database/campi definizioni cercano di controllare:

Field Type 
Field Collation 
Table Engine 
5

MySQL sarà anche gettare questo errore se il errori di digitazione il nome della tabella di riferimento. Ho tirato fuori i miei capelli per un po 'fino a quando mi sono reso conto di aver perso una lettera in foreign key (column1) references mistyped_table(column1)

+0

In alcune situazioni, il caso (del nome della tabella) è importante, in alcuni casi no. Ad esempio, il mio script ha funzionato su mysql su OSX, ma su Linux ho avuto questo problema: 150. Il caso era il mio problema. – prule

+0

Analogamente, avevo "FOREIGN KEY (user_id) REFERENCES utente (id) ON DELETE CASCADE', ma la tabella' user' non ha campo 'id' - si chiamava' user_id'! Quindi in quanto sopra ho cambiato 'user (id)' in 'user (user_id)', e tutto andava bene di nuovo nell'universo ... per ora. – elimisteve

0

Per me, il problema era con l'utilizzo di CONSTRAINT nella query CREATE TABLE.

0

È inoltre possibile riscontrare lo stesso errore quando si tenta di fare riferimento a una chiave composita nella chiave esterna.

Ad esempio:

CREATE TABLE `article` (
    `id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    PRIMARY KEY (`id`,`type`) 
) ENGINE InnoDB; 

CREATE TABLE `t1` (
    `user_id` int(10) unsigned NOT NULL, 
    `type` enum('X','Y','Z') NOT NULL, 
    `article_id` int(10) unsigned NOT NULL, 
    CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB 

In questo caso, è importante utilizzare article_id e campo di tipo nella definizione FK nello stesso ordine in cui compaiono nella definizione PRIMARY KEY tabella article.

0

Nel mio caso è stato probabilmente un errore del server che ha lasciato cadere una tabella con lo stesso nome. Eliminare l'intero shcema e ricrearlo ha risolto il problema.

0

Se si sta lavorando su MySQL Workbench e si ottiene questo errore per una tabella di relazione ci può essere una soluzione rapida per voi: è sufficiente eliminarlo e lasciare MySQL Workbench Ricrea è per te. Quindi copia lo sql. Risolto il problema con errno 150.

0

Ho ricevuto questo errore durante il tentativo di utilizzare una chiave esterna per fare riferimento a un campo non univoco. (che apparently non è consentito)

0

Quando ho avuto questo problema era perché avevo impostato l'id nella prima tabella per essere unsigned mentre la chiave esterna nella seconda tabella non lo era. Rendendoli entrambi unsigned risolto per me.

Problemi correlati