Magento从1.4.0.1升级1.9.2.3:升级安装程序抛出错误:无法添加外键约束

时间:2016-01-29 19:55:12

标签: magento upgrade magento-1.4 customer

尝试 将magento系统从1.4.0.1升级到最新的1.9.2.3

在升级安装程序文件<{1}}

Mage_Customer模块中收到错误

投掷错误:

mysql4-upgrade-1.4.0.0.7-1.4.0.0.8.php
  • 如何解决此问题
  • 错误原因是什么;

3 个答案:

答案 0 :(得分:3)

原因:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

实际上意味着脚本无法创建外键约束,因为错误确实存在,但是失败的原因其实很简单,如果两个字段你就不允许你创建一个FK试图链接没有完全相同的类型和长度。

现在,从此更新脚本的第31行开始,您确实可以在字段attribute_id

上添加外键约束来创建表。
$installer->run("
CREATE TABLE `{$installer->getTable('customer/form_attribute')}` (
  `form_code` char(32) NOT NULL,
  `attribute_id` smallint UNSIGNED NOT NULL,
  PRIMARY KEY(`form_code`, `attribute_id`),
  KEY `IDX_CUSTOMER_FORM_ATTRIBUTE_ATTRIBUTE` (`attribute_id`),
  CONSTRAINT `FK_CUSTOMER_FORM_ATTRIBUTE_ATTRIBUTE` FOREIGN KEY (`attribute_id`) REFERENCES `{$installer->getTable('eav_attribute')}` (`attribute_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Customer attributes/forms relations';
");

但您也可以看到字段attribute_id创建为最小但没有长度。

由于这个链接到表eav_attribute,您现在可以尝试从您将创建的虚拟表中比较字段类型和类型smallint的字段。

CREATE TABLE `dummy_table` (`attribute_id` smallint UNSIGNED NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# you should now have the table named "dummy_table"

show fields from dummy_table where field = 'attribute_id';
# the Type should be "smallint(5) unsigned" and Null should be "No", if not, that is why the foreign key creation fail.
show fields from eav_attribute where field = 'attribute_id';
# the Type should be "smallint(5) unsigned" and Null should be "No"

drop table `dummy_table`;
# clean up of our testing table

决议:

现在,如果字段eav_attribute.attribute_id不是smallint(5) unsigned not null,那么您可以安全地修改eav_attribute.attribute_id以使其smallint(5) unsigned not null

如果您在虚拟表格中创建的字段不是smallint(5) unsigned not null,那么只需编辑文件mysql4-upgrade-1.4.0.0.7-1.4.0.0.8.php的第34行,即可正确创建字段。

  // `attribute_id` smallint UNSIGNED NOT NULL, -- old line
  `attribute_id` smallint(5) UNSIGNED NOT NULL, // new line, so the field have the right type

答案 1 :(得分:1)

请确保在导出原始数据库时将“检查外键约束”设置为“关闭”。

导入此数据库时,问题不再存在。

答案 2 :(得分:1)

这可能是数据库引擎的问题。几个月前我也遇到了同样的问题所以我 compared my updated magento database tables engine 使用1.9数据库表引擎,发​​现所有表都有 MyISAM 作为数据库引擎,所以我在 1.9数据库中更改了它,我的问题得到了解决