Domanda

devo creare un database con due tabelle in MySQL, ma lo script non riesce con errno 150 (problema chiave esterna). Ho ricontrollato i campi chiave esterna per essere lo stesso su entrambi i tavoli, e non riesco a trovare alcun errore.

Ecco lo script:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@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 SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

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

Tutte le idee?

È stato utile?

Soluzione

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

Si è tenuto a mettere un vincolo su FOREIGN KEY field1.

Con questa:

 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.

Altri suggerimenti

Mentre si lavora con MySQL Workbench e MySQL 5.5.27, ho incontrato il problema simile. Nel mio caso è stato problema con campi di tipo INT. Erroneamente in una tabella era unsigned int e in riferimento tavolo era INT.

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

Una delle risposte suggerisce qui per disattivare il controllo di integrità chiave esterna. Questa è una cattiva idea. Ci sono due probabili colpevoli qui:

  • Tipo di dati mancata corrispondenza tra la chiave primaria di riferimento e riferimenti chiave esterna
  • Indici. Le eventuali chiavi esterne cui si indice deve essere NOT NULL

Un altro suggerimento:

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

È inoltre necessario assicurarsi che entrambe le colonne hanno la stessa COLLATION.

Ancora un'altra causa, anche se leggermente simile ad altri:. Facevo riferimento a una tabella che risultò avere il motore MyISAM, invece di InnoDB

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 che ho perso una lettera in foreign key (column1) references mistyped_table(column1)

Un'opzione (a seconda del caso) sarebbe di disabilitare il controllo di integrità MySQL:

SET FOREIGN_KEY_CHECKS = 0;

Se non funziona, provate questo:

Il nome chiave esterna è un duplicato di una chiave già esistente. Verificare che il nome della vostra chiave esterna è univoco all'interno del database. Basta aggiungere un paio di caratteri casuali alla fine del tuo nome chiave per test per questo.

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

Nel caso in cui qualcuno sta ancora avendo problemi con questo, ho provato tutte le soluzioni di cui sopra (ad eccezione di SET FOREIGN_KEY_CHECKS) e niente ha funzionato. Il problema era che quando si fa riferimento alla prima tabella, alcuni database sono case sensitive circa i nomi di tabella. Penso che questo sia strano dato che non ho mai visto prima su MySQL, Oracle e ora questo è accaduto 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 (minuscole) al posto di CADASTRO_MAQUINAS, riceverò questo errore.

ero usando MySQL workBench. Il problema è che non è possibile utilizzare lo stesso foreign key name, hanno bisogno di essere unique. Quindi, se più di una tabella farà riferimento la stessa chiave esterna, ogni volta che ci deve essere un nome unique dato.

Ho avuto un errore simile su una delle mie tabelle. Quando segnato fascicolazione colonna era diverso, che una volta lavorato cambiato entrambe le colonne allo stesso tipo di confronto.

Dopo aver letto la maggior parte della soluzione suggerita qui. Ho solo pensato che potrebbe essere utile se ho appena elencare giù tutte le possibilità che potrebbero gettare 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)

Nel mio caso ho avuto vecchia definizione delle tabelle MyISAM in una delle tabelle e, ovviamente, non sono riuscito a fare chiave esterna ad esso da un altro tavolo. Forse questo aiuto a qualcuno.

Quindi questo può accadere a causa di incongruenze tra due database / campi definizioni cercano di controllare:

Field Type
Field Collation
Table Engine

Per quanto mi riguarda, il problema era con l'utilizzo CONSTRAINT nella query CREATE TABLE.

È inoltre possibile incontrare lo stesso errore quando si tenta di fare riferimento a una chiave composta in 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 appaiono nella definizione della tabella articolo chiave primaria.

Nel mio caso era probabilmente un bug del server cadere una tabella con lo stesso nome. Far cadere l'intero shcema e ricreare ha risolto il problema.

In casi molto strani il database potrebbe essere rotto. Nel mio caso non ho avuto alcun tasto stranieri sul tavolo e l'unico rinominando il tavolo o cambiare motore aiutato.

Si è rivelato InnoDB era rotto, vedi: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted -Mentre-cercato-per-un? LQ = 1

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 che MySQL Workbench ricreare per voi. Quindi copiare lo sql. Fisso il mio errno 150 problema.

ho ottenuto questo errore durante il tentativo di utilizzare una chiave esterna per fare riferimento a un campo non univoco. (Che a quanto pare non è consentito)

Quando ho avuto questo problema è stato perché avevo impostato l'id nella prima tabella ad essere unsigned, mentre la chiave esterna nella seconda tabella non è stato. Fare entrambe unsigned fissata per me.

Crea sempre maestri tabelle / genitori prima, e poi creare i dettaglio / tabelle figlio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top