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?
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
Danke, das hat funktioniert! Sende es als Antwort und ich werde es als korrekt markieren. – Elie