Mysql: le message d'erreur ne peut pas créer un tableau (errno: 150)
-
13-11-2019 - |
Question
J'ai deux tables, «po» et «reçoivent»
CREATE TABLE `po` (
`PO_ID` bigint(20) NOT NULL,
`SERVICE_TYPE` bit(1) DEFAULT NULL,
`ENTRY_DATE` date NOT NULL,
`RECEIPT_DATE` date DEFAULT NULL,
`TURNOVER` date DEFAULT NULL,
`MOBILIZATION` date DEFAULT NULL,
`SITE_NAME` varchar(255) NOT NULL,
`SITE_CODE` varchar(45) DEFAULT NULL,
`SITE_TIN` varchar(45) DEFAULT NULL,
`SITE_ADDRESS` varchar(255) NOT NULL,
`COST` decimal(11,2) NOT NULL,
`XML` text,
PRIMARY KEY (`PO_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `receive` (
`RECEIPT_ID` varchar(100) NOT NULL,
`RECEIPT_DATE` date NOT NULL,
`PO_NUMBER` bigint(20) NOT NULL,
`SUPPLIER_ID` int(11) NOT NULL,
PRIMARY KEY (`RECEIPT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
J'essaie de connecter deux tables en définissant une clé étrangère 'fk_po' sur la table 'reçoit'
ALTER TABLE `fourthwave`.`receive`
ADD CONSTRAINT `fk_po`
FOREIGN KEY (`PO_NUMBER` )
REFERENCES `fourthwave`.`po` (`PO_ID` )
ON DELETE SET NULL
ON UPDATE SET NULL
, ADD INDEX `fk_po` (`PO_NUMBER` ASC)
Cependant, la requête alter ci-dessus lance une erreur:
Error Code: 1005. Can't create table 'fourthwave.#sql-aec_11' (errno:150)
Suis-je en train d'obtenir cette erreur parce que les noms du champ, «po_id» et «po_number» sur les deux tables sont différents?
La solution
Exécutez l'afficher Instat InnodB Status Instat après alter table, et vous verrez le message d'erreur - «Vous avez défini une condition nul définie, bien que certaines colonnes soient définies comme non nuls».
ALTER TABLE `receive`
ADD CONSTRAINT `fk_po`
FOREIGN KEY (`PO_NUMBER` )
REFERENCES `po` (`PO_ID` )
ON DELETE SET NULL
ON UPDATE SET NULL
, ADD INDEX `fk_po` (`PO_NUMBER` ASC);
SHOW ENGINE INNODB STATUS;
Autres conseils
Vous avez besoin d'un index sur PO_NUMBER
dans le receive
table. Le domaine que vous faites référence dans une clé étrangère doit toujours être indexé.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow