MySQL的:错误信息不能创建表(错误:150)
问题描述:
我有两个表,“宝”,并通过定义一个外键“接收”MySQL的:错误信息不能创建表(错误:150)
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$$
我试图连接两个表“ “对表‘fk_po收到’
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)
然而,变更查询上述抛出一个错误:
Error Code: 1005. Can't create table 'fourthwave.#sql-aec_11' (errno:150)
我收到此错误,因为网络这两个表的字段名称'PO_ID'和'PO_NUMBER'是不同的?
答
在ALTER TABLE之后执行SHOW ENGINE INNODB STATUS语句,您将看到错误消息 - '您已定义SET NULL条件,尽管某些 列被定义为NOT NULL'。
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;
答
您需要receive
表中的PO_NUMBER
索引。您在外键中引用的字段应始终编入索引。
这有效吗?你可以有一个同名的索引和FK约束? – 2012-02-27 17:35:51
是的,它的工作原理。你可以给出另一个名字,但是如果你不创建这个索引,MySQL将自己创建它 - 具有相同的名称。 – Devart 2012-02-27 17:53:43
有趣。当我添加FK并忽略约束的名称时,MySQL总是自动填充类似'some_table_ibfk_1'的东西,我认为这是为了确保在索引和FK方面没有名称冲突。 – 2012-02-27 17:57:59