2009-11-29 14 views
8

Ich habe das folgende Skript, um eine Tabelle in MySQL Version 5.1 zu erstellen, die auf 3 andere Tabellen beziehen soll. Alle 3 Tabellen wurden mit InnoDB erstellt, und alle 3 Tabellen haben die ID-Spalte als INT definiert.Fremdschlüssel und MySQL-Fehler

Ich habe andere Tabellen erfolgreich erstellt, die auf ACCOUNT und PERSON verweisen, jedoch ist dies die erste Tabelle, die auf ADDRESS verweist, also habe ich die Definition für diese Tabelle wie unten ausgeführt.

Der Fehler, den ich bekomme, ist ERROR 1005 (HY000) mit errno 150, von dem ich weiß, dass es sich um die Erstellung von Fremdschlüsseln handelt.

Das Skript, das ist (der Einfachheit halber entfernt zusätzliche Spalten) nicht:

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; 

Die SQL-Anweisung, die Adresstabelle zu erstellen, ist unten (zusätzliche Spalten der Einfachheit halber entfernt).

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; 

Ich habe hier einige Fragen durchgeblättert mit ähnlichen Problemen zu tun, aber die meisten scheinen doppelte Definitionen und nicht passenden Feldtypen zu sein, sowie einige mit InnoDB nicht für die eine oder andere der Tabellen. Keines davon scheint jedoch das Problem zu sein. Irgendwelche Ideen?

+2

Ihre DELETE Aktion auf dem LOCATION_ID Schlüssel sieht nicht ganz richtig, da LOCATION_ID als NOT NULL definiert ist. Ich glaube nicht, dass mysql dies während der Constraint-Erstellung überprüft hat, obwohl ... – grossvogel

+0

Danke, das hat funktioniert! Sende es als Antwort und ich werde es als korrekt markieren. – Elie

Antwort

13

Sie können jederzeit den Befehl 'SHOW ENGINE INNODB STATUS' ausgeben. Begraben in der Ausgabe wird ein „AKTUELLE FOREIGN KEY ERROR“ Abschnitt sein, die auf genau mehr Details haben wird, was verursacht die ‚150‘ Fehler:

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

Cool, lerne jeden Tag etwas Neues (ich denke, das bedeutet, dass ich für den Rest des Tages aus dem Schneider bin). – Elie

Verwandte Themen