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; 
+0

这有效吗?你可以有一个同名的索引和FK约束? – 2012-02-27 17:35:51

+0

是的,它的工作原理。你可以给出另一个名字,但是如果你不创建这个索引,MySQL将自己创建它 - 具有相同的名称。 – Devart 2012-02-27 17:53:43

+0

有趣。当我添加FK并忽略约束的名称时,MySQL总是自动填充类似'some_table_ibfk_1'的东西,我认为这是为了确保在索引和FK方面没有名称冲突。 – 2012-02-27 17:57:59

您需要receive表中的PO_NUMBER索引。您在外键中引用的字段应始终编入索引。