2012-06-15 17 views
14

Wystąpił błąd podczas próby utworzenia tabeli w mysql.BŁĄD 1005 (HY000): Nie można utworzyć tabeli (errno: 150)

Jakieś wskazówki dotyczące rozwiązania problemu?

create table stock_in(
    ind int not null auto_increment, 
    itemcode varchar(10) not null, 
    quantity int not null, 
    description text not null, 
    sales_ref int not null default -1, 
    return_outwards_ref int not null default -1, 
    stock_in_receipt_ref int not null default -1, 
    date text not null, 
    time text not null, 
    username text not null, 
    foreign key (sales_ref) references sales (receiptno), 
    foreign key (return_outwards_ref) references returnoutwards(ind), 
    primary key (ind) 
); 

Błąd:

ERROR 1005 (HY000): Can't create table 'posinventory.stock_in' (errno: 150) 
+0

Czy stworzyłeś tabele 'sales' i' returnoutwards' z unikalnymi kluczami? Wszystkie tabele muszą być InnoDb. – Devart

+0

@Devart: Dzięki, znalazłem swój błąd ... to dlatego, że paragon w tabeli sprzedaży nie jest kluczem podstawowym ... Powinienem go odnieść do nowej kolumny z kluczem podstawowym, na przykład sales_no – Boon

Odpowiedz

25

Zapoznaj się z instrukcja MySQL o foreign key constrains:

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Kilka pomysłów:

  • Lepsze upuść tabele i utwórz go za pomocą dobrze sformułowanej składni.
  • Pamiętaj, aby dodać ENGINE=InnoDB; do swojej komendy CREATE TABLE.
  • Upewnij się, że InnoDB jest włączony na serwerze MySQL. Aby to sprawdzić, spróbuj tego polecenia: SHOW VARIABLES LIKE 'have_innodb'; - jeśli zwróci TAK, to InnoDB jest włączone.
  • Sprawdź swoje polecenie dla górnej i dolnej litery w tabeli i nazwach pól.
  • Sprawdź nie tylko jedną tabelę, którą chcesz utworzyć, ale także tabele, do których odnoszą się klucze obce.
  • Upewnij się, że podane tabele są poprawnie zindeksowane.
+0

Dzięki, znalazłem mój błąd ... to dlatego, że paragon w tabeli sprzedaży nie jest kluczem podstawowym ...Powinienem odwołać się do nowej kolumny z kluczem podstawowym, na przykład sales_no – Boon

+0

Miałem również ten sam błąd i po zindeksowaniu tabel nadrzędnych na kluczach podstawowych, błąd został rozwiązany. – sreeprasad

+2

Chciałbym dodać, że otrzymujesz komunikat, jeśli którakolwiek z tabel, do których odnosisz się z FK, nie jest tym samym silnikiem; cóż, na pewno, jeśli nie są InnoDB. –

1

Jednym z powodów może być typ danych kolumny klucza obcego i długość powinna być taka sama jak kolumna klucza tabeli odsyłającej. Na przykład kolumna tabeli odnie sienia jest średnia (11), a kolumna klucza obcego to int (11) oznacza, że ​​wystąpi błąd podczas tworzenia tabeli z kluczem obcym.

4

Miał dokładnie ten sam problem. Jego źródłem są typy kluczy obcych i odniesienia.

klucz obcy:

fer_id SMALLINT NOT NULL 

a pole pochodzenie (refernce do którego zapewniamy):

id INT(11) UNSIGNED NOT NULL 

Właśnie dokonać INT fer_id (11) UNSIGNED również. Magicznie działa!

1

Oprócz innych rzeczy, upewnij się, że obie tabele/pola odpowiadają ustawieniom CHARSET. Pole typu UTF może mieć zasadniczo inny rozmiar niż "latin1". SHOW CREATE TABLE na obu tablicach pokaże, jeżeli zachodzi niedopasowanie

1

Jeśli przywrócić kopię zapasową bazy danych może powodować chwilowe wyłączenie kluczy obcych sprawdzić wkładając te sznurki na początku pliku .sql:

/*!40030 SET NAMES UTF8 */; 
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 
Powiązane problemy