2009-11-29 14 views
8

Mam następujący skrypt do tworzenia tabeli w MySQL w wersji 5.1, który ma odnosić się do 3 innych tabel. Wszystkie 3 tabele zostały utworzone przy użyciu InnoDB, a wszystkie 3 tabele mają kolumnę ID zdefiniowaną jako INT.kluczy obcych i MySQL Błędy

Z powodzeniem utworzyłem inne tabele, które odwołują się do KONTA i OSOBY, jednak jest to pierwsza tabela, która odwołuje się do ADRESU, więc dodałem definicję dla tej tabeli, tak samo jak uruchom, poniżej.

Błąd który Dostaję jest ERROR 1005 (HY000) z errno 150, który rozumiem zostać odnoszące się do stworzenia klucza obcego.

Skrypt, który nie jest (dodatkowe kolumny usunięte dla uproszczenia):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ACCOUNT_ID INT NOT NULL, 
    CUSTOMER_ID INT NOT NULL, 
    SALES_ID INT, 
    TRADES_ID INT, 
    LOCATION_ID INT NOT NULL, 
    INDEX CUST_INDEX(CUSTOMER_ID), 
    INDEX SALES_INDEX(SALES_ID), 
    INDEX TRADES_INDEX(TRADES_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    INDEX LOCATION_INDEX(LOCATION_ID), 
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE, 
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL 
) ENGINE=InnoDB; 

Instrukcja SQL używane do tworzenia tabeli adres jest poniżej (dodatkowe kolumny usunięte dla uproszczenia).

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    PERSON_ID INT NOT NULL, 
    ACCOUNT_ID INT NOT NULL, 
    ADDRESS_L1 VARCHAR(50), 
    ADDRESS_L2 VARCHAR(50), 
    CITY VARCHAR(25), 
    PROVINCE VARCHAR(20), 
    POSTAL_CODE VARCHAR(6), 
    COUNTRY VARCHAR(25), 
    INDEX CUST_INDEX(PERSON_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

ja przeglądałem przez kilka pytań tutaj do czynienia z podobnymi problemami, ale większość z nich wydaje się być zduplikowane definicje i typy pól nie pasujące, jak również niektóre nie używając InnoDB dla jednej lub drugiej z tabel. Jednak żaden z nich nie wydaje się być problemem. Jakieś pomysły?

+2

Twój DELETE akcja na kluczu LOCATION_ID nie wygląda całkiem dobrze, ponieważ LOCATION_ID jest zdefiniowany jako NOT NULL. Nie myślałem, że mysql sprawdził to podczas tworzenia więzów, chociaż ... – grossvogel

+0

Dzięki, to zadziałało! Opublikuj jako odpowiedź i zaznaczę to poprawnie. – Elie

Odpowiedz

13

Zawsze można wydać komendę a 'SILNIK SHOW InnoDB Stan'. Pochowany na wyjściu będzie sekcja „Najnowsze FOREIGN KEY ERROR”, która będzie miała więcej szczegółów na dokładnie, co spowodowało „150” błąd:

mysql> create table a (x int not null) type=innodb; 
Query OK, 0 rows affected, 1 warning (0.02 sec) 

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb; 
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150) 

mysql> show engine innodb status; 
[..... snip snip snip ...] 
------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
091129 16:32:41 Error in foreign key constraint of table test/b: 
foreign key (y) references a (x) on delete set null) type=innodb: 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 
[.... snip snip snip ...] 
+0

Fajnie, ucz się czegoś nowego każdego dnia (myślę, że to oznacza, że ​​nie mam ochoty uczyć się przez resztę dnia). – Elie

Powiązane problemy