我有一个使用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的表?任何人都可以对此有所了解吗?
如果需要更多信息以帮助解决这个问题,请告诉我,我将包括在内。
答案 0 :(得分:1)
错误消息告诉我们外键约束没有正确形成。
外键列和引用列的数据类型不匹配。
或者在引用的表上没有定义索引,引用的列作为前导列。
或者project
表中的行与参考表中的行不匹配。也就是说,product_id
列包含的值不会出现在oc73_product
表格中。
错误信息并没有区分这些可能性;它告诉我们外键存在问题。
表名#sql-3d63_ca5dc
是一个中间名。当ALTER TABLE运行时,MySQL将创建表的工作副本,然后将现有表的名称交换到新副本。
要进行调试,
比较product_id
和project
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报告该错误的任何细节。