Question

J'ai le script suivant pour créer une table dans MySQL version 5.1 qui doit faire référence à 3 autres tables. Toutes les 3 tables ont été créées avec InnoDB et la colonne ID est définie sur INT.

J'ai créé avec succès d'autres tables qui font référence à ACCOUNT et à PERSON. Cependant, il s'agit du premier tableau qui fait référence à ADDRESS. J'ai donc également inclus la définition de cette table, telle qu'elle est exécutée.

L'erreur que j'obtiens est ERROR 1005 (HY000) avec errno 150, ce qui, d'après ce que je comprends, concerne la création de clé étrangère.

Le script qui échoue est (colonnes supplémentaires supprimées pour des raisons de simplicité):

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;

L’instruction SQL utilisée pour créer la table ADDRESS est présentée ci-dessous (les colonnes supplémentaires ont été supprimées pour des raisons de simplicité).

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;

J'ai parcouru plusieurs questions ici traitant de problèmes similaires, mais la plupart semblent être des définitions en double et des types de champs ne correspondant pas, ainsi que certaines n'utilisant pas InnoDB pour l'une ou l'autre des tables. Cependant, aucun de ceux-ci ne semble être le problème. Des idées?

Était-ce utile?

La solution

Vous pouvez toujours émettre une commande 'SHOW ENGINE INNODB STATUS'. Un message "LATEST FOREIGN KEY ERROR" est enterré dans la sortie. section, qui contiendra plus de détails sur la cause exacte de l'erreur "150":

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 ...]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top