Frage

Ich habe das folgende Skript eine Tabelle in MySQL Version 5.1 zu erstellen, die zu drei anderen Tabellen zu entnehmen ist. Alle drei Tabellen wurden InnoDB erstellt, und alle drei Tabellen haben die ID-Spalte als INT definiert.

ich anderen Tabellen erfolgreich erstellt haben, die Konto- und PERSON verweisen, jedoch ist dies die erste Tabelle, die Adreßverweise, also habe ich die Definition für diese Tabelle als Lauf enthalten, unter als auch.

Der Fehler, die ich erhalte ist ERROR 1005 (HY000) mit errno 150, die ich verstehe, um Fremdschlüssel Schöpfung zu beziehen.

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

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 verwendet, um die ADDRESS-Tabelle zu erstellen ist unter (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. Doch keiner von ihnen scheint das Problem zu sein. Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie können immer Befehl ein ‚SHOW ENGINE BDB STATUS‘ auszustellen. 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 ...]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top