Mysql. Imansible creare errno di tabella 150

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.

Ecco la sceneggiatura:

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; 

L’ho provato in Windows e Ubuntu con diverse versioni di Mysql e non ha funzionato.

Qualche idea? Molte grazie.

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

    È necessario posizionare un vincolo FOREIGN KEY sul 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.

    Durante il lavoro 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.

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

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

    • Mancata corrispondenza del tipo di dati tra la chiave primaria referenziata e la chiave esterna di riferimento
    • Indici. Qualsiasi chiave esterna che indichi deve essere NOT NULL

    Un altro suggerimento:

    Anche quando i tuoi tipi di dati sembrano essere gli stessi – nel mio caso entrambe le colonne avevano VARCHAR(50) – questo non è abbastanza.

    Devi anche assicurarti che entrambe le colonne abbiano la stessa COLLATION .

    Un’opzione (a seconda dei casi) sarebbe disabilitare il controllo dell’integrità di mysql:

     SET FOREIGN_KEY_CHECKS = 0; 

    Un’altra causa, sebbene leggermente simile alle altre: mi riferivo a un tavolo che si è rivelato avere il motore MyISAM, invece di InnoDB.

    MySQL lancia anche questo errore se digita in modo errato il nome della tabella di riferimento. Mi sono tirato fuori i capelli per un po ‘fino a quando mi sono reso conto che mi mancava una lettera in foreign key (column1) references mistyped_table(column1)

    Se non funziona nulla, prova questo:

    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. Basta aggiungere alcuni caratteri casuali alla fine del nome della chiave per verificarlo.

    Crea sempre le tabelle principale / padre, quindi crea le tabelle dettaglio / figlio.

    Nel mio caso, una tabella utilizzava vincoli di chiave esterna su un’altra tabella che non esisteva ancora. Questo stava accadendo a causa di un grande makefile, quindi non era così ovvio come mi sarei aspettato.

    Nel caso qualcuno abbia ancora problemi con questo, ho provato tutte le soluzioni sopra (tranne per 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.

    Per esempio:

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

    Crea tabella se non esiste INFOS (Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Riferimenti chiave esterna (Id_Maquina) CADASTRO_MAQUINAS (Id));

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

    Stavo usando MySQL workBench . Il problema è che non è ansible 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 .

    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, Controlla CASE della colonna 2, Verifica COLLATION of Columns 3, Verifica se è stata creata una chiave in entrambe le tabelle per la colonna (Unique, Primary)

    Nel mio caso ho ottenuto la vecchia definizione del tavolo MyISAM in una delle tabelle e ovviamente non ero in grado di creare una chiave esterna da un’altra tabella. Forse questo aiuta qualcuno.

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

     Field Type Field Collation Table Engine 

    Per me, il problema era con l’uso di CONSTRAINT nella query CREATE TABLE .

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

    Per 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 type field nella definizione FK nello stesso ordine in cui appaiono nella definizione della tabella dell’articolo PRIMARY KEY.

    Nel mio caso era probabilmente un bug del server che lasciava cadere una tabella con lo stesso nome. Eliminare l’intero shcema e ricrearlo ha risolto il problema.

    In casi molto strani il tuo database potrebbe essere danneggiato. Nel mio caso non ho avuto alcuna chiave straniera sul tavolo e l’unico rinominare il tavolo o cambiare motore ha aiutato.

    Venuto fuori innoDB era rotto, vedi: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to- un? lq = 1

    Se stai lavorando su mysql workbench e ottieni questo errore per una tabella delle relazioni, potrebbe esserci una soluzione rapida: eliminalo e lascia che mysql workbench lo ricrea per te. Quindi copia lo sql. Risolto il problema con errno 150.

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

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