2011-08-25 11 views
6

Naprawdę nienawidzę korzystać z czasu innych ludzi, ale wygląda na to, że problem nie zniknie.Nie można utworzyć tabeli (errno: 150) InnoDB dodając ograniczenia klucza obcego

Rozważałem wszystkie zalecenia na http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ i http://forums.mysql.com/read.php?22,19755,19755#msg-19755, ale nic.

mam nadzieję, że ktoś wskaże głupi błąd.

tutaj są tabele: Kod

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; 

Błąd: 1005. Nie można utworzyć tabeli 'shop.product_category' (errno: 150)

Odpowiedz

9

Trzeba indeks na category_id w tabeli kategorii (Widzę, że jest to część klucza podstawowego, ale ponieważ jest to druga kolumna w indeksie, nie można jej użyć). Pole, do którego odwołujesz się w kluczu obcym, zawsze powinno być indeksowane.

+0

Dzięki! To rozwiązało problem! –

+0

Jeśli to rozwiązało problem, oznacz odpowiedź jako zaakceptowaną! – ddinchev

+0

Przepraszam, jak to zrobić? –

1

W moim przypadku problem był bardziej podobny do tego, co opisano w pierwszym artykule, do którego linkowałeś.

Więc po prostu musiał się upewnić, że:

  • Referenced Column jest indeksem,
  • zarówno Referencing Column i Referenced Column akcji tego samego rodzaju i długości, to znaczy na przykład oba są INT(10),
  • zarówno dzielić tego samego nie zerowy, unsigned, ZEROFILL itp konfiguracja.
  • obie tabele to InnoDB!

Oto szablon zapytania gdzie Referencing Column jest referencing_id i Referenced Column jest 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; 

Aktualizacja 13.03.2016: Ran na ten problem znów skończyło się znalezieniem własną odpowiedź. Tym razem jednak nie pomogło. Okazuje się, że drugi stół nadal był ustawiony na MyISAM, jak tylko zmieniłem go na InnoDB, wszystko działało.