SQLSTATE常规错误1005无法创建表' #sql-3d63_ca5dc9' (错误:150)

时间:2017-03-27 13:59:20

标签: mysql symfony doctrine

我有一个使用Doctrine的Symfony CRM项目,我目前正在转移到新服务器,CRM连接到OpenCart 2。

我的一些表有外键,允许我从我的项目中定制的一些OpenCart表中引用,例如产品表的产品ID和客户表的客户ID等。

但是,当我尝试运行doctrine:schema:update --force时,我收到以下错误:

  

执行' ALTER TABLE项目ADD时发生异常   CONSTRAINT FK_2FB3D0EE4584665A FOREIGN KEY(product_id)参考文献   oc73_product(product_id)':

     

SQLSTATE [HY000]:常规错误:1005无法创建表格   '#oc2017_myshop SQL-3d63_ca5dc9' (错误:150)

它抛出此错误的两个语句如下:

ALTER TABLE project ADD CONSTRAINT FK_2FB3D0EE4584665A FOREIGN KEY (product_id) REFERENCES oc73_product (product_id);
ALTER TABLE project ADD CONSTRAINT FK_2FB3D0EEB18AFA7E FOREIGN KEY (stageName) REFERENCES stage (id);

我不太明白上述错误意味着什么,因为我没有创建一个名为sql-3d63_ca5dc9的表?任何人都可以对此有所了解吗?

如果需要更多信息以帮助解决这个问题,请告诉我,我将包括在内。

1 个答案:

答案 0 :(得分:1)

错误消息告诉我们外键约束没有正确形成。

外键列和引用列的数据类型不匹配。

或者在引用的表上没有定义索引,引用的列作为前导列。

或者project表中的行与参考表中的行不匹配。也就是说,product_id列包含的值不会出现在oc73_product表格中。

错误信息并没有区分这些可能性;它告诉我们外键存在问题。

表名#sql-3d63_ca5dc是一个中间名。当ALTER TABLE运行时,MySQL将创建表的工作副本,然后将现有表的名称交换到新副本。

要进行调试,

比较product_idproject

oc73_product列的数据类型
SHOW CREATE TABLE project ;
SHOW CREATE TABLE oc73_product ;

数据类型必须是完全匹配。

验证oc73_product是否有一个以product_id作为前导列的KEY。这可以是PRIMARY KEY,一个独特的键,或者我认为MySQL甚至可以让你只使用一个KEY。

确认project中没有违反约束的行。如果此查询返回任何行,那么违反外键约束的行:

SELECT j.product_id
  FROM project j
  LEFT
  JOIN oc73_product d
    ON d.product_id = j.product_id
 WHERE d.product_id IS NULL

使用反连接模式(上面)的查询结果等同于:

SELECT j.product_id
  FROM project j
 WHERE NOT EXISTS ( SELECT 1
                      FROM oc73_product d
                     WHERE d.product_id = j.product_id
                  )

<强>后续

正如@Shadow在评论中提到的那样,SHOW ENGINE INNODB STATUS的输出可能包含以下部分:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2017-03-27 14:14:14 7fce73f9d700 Error in foreign key constraint creation
  for table `db`.`table_name`.

详细说明遇到的错误情况。 InnoDB引擎比他告诉MySQL更了解错误。 MySQL只是报告&#34; InnoDB报告错误150&#34;,没有为什么 InnoDB报告该错误的任何细节。