2011-08-25 10 views
6

Odio davvero usare il tempo di altre persone, ma sembra che il problema non stia andando via.Impossibile creare una tabella (errno: 150) InnoDB aggiunge vincoli di chiave esterna

Ho considerato tutte le raccomandazioni su http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ e su http://forums.mysql.com/read.php?22,19755,19755#msg-19755 ma nulla.

spero che qualcuno indichi uno stupido errore.

qui sono le tabelle: Codice

CREATE TABLE IF NOT EXISTS `shop`.`category` (
    `id` INT(11) NOT NULL AUTO_INCREMENT , 
    `category_id` INT(11) NOT NULL , 
    `parent_id` INT(11) NULL DEFAULT '0' , 
    `lang_id` INT(11) NOT NULL , 
    ...other columns... 
    PRIMARY KEY (`id`, `category_id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 



CREATE TABLE IF NOT EXISTS `shop`.`product_category` (
    `category_id` INT(11) NOT NULL , 
    `product_id` INT(11) NOT NULL , 
    INDEX `fk_product_category_category1_zxc` (`category_id` ASC) , 
    CONSTRAINT `fk_product_category_category1_zxc` 
    FOREIGN KEY (`category_id`) 
    REFERENCES `shop`.`category` (`category_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

Errore: 1005. Impossibile creare la tabella 'shop.product_category' (errno: 150)

risposta

9

È necessario un indice sul category_id nella tabella delle categorie (Vedo che fa parte della chiave primaria, ma poiché è la seconda colonna dell'indice, non può essere utilizzata). Il campo a cui si fa riferimento in una chiave esterna deve sempre essere indicizzato.

+0

Grazie! Questo ha risolto il problema! –

+0

Se questo risolve il problema, segna la risposta come accettata! – ddinchev

+0

Scusa, come faccio? –

1

Nel mio caso il problema era più simile a quello descritto nel primo articolo a cui ti sei collegato.

Così ho dovuto fare in modo che:

  • Referenced Column è un indice,
  • sia Referencing Column e Referenced Column condividono la stessa tipo e la lunghezza, vale a dire per esempio entrambi sono INT(10),
  • entrambi condividono la stessa non nullo, senza segno, zerofill ecc configurazione.
  • entrambe le tabelle sono InnoDB!

Ecco il modello di query in cui è Referencing Columnreferencing_id e Referenced Column è referenced_id:

ALTER TABLE `db`.`referencing` 
ADD CONSTRAINT `my_fk_idx` 
FOREIGN KEY (`referencing_id`) 
REFERENCES `db`.`referenced`(`referenced_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

Aggiornamento 2016/03/13: imbattuto in questo problema ancora una volta, abbiamo finito per trovare la mia risposta. Questa volta non è stato di aiuto. Risulta che l'altro tavolo era ancora impostato su MyISAM, non appena l'ho cambiato in InnoDB, tutto ha funzionato.