5

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

升级安装程序文件时Mage_Customer 模块出错mysql4-upgrade-1.4.0.0.7-1.4.0.0.8.php

投掷错误:

a:5:{i:0;s:199:"Error in file: "app/code/core/Mage/Customer/sql/
customer_setup/mysql4-upgrade-1.4.0.0.7-1.4.0.0.8.php" - SQLSTATE[HY000]:
General error: 1215 Cannot add foreign key constraint";i:1;s:970:"
#0 app/code/core/Mage/Core/Model/Resource/Setup.php(644): Mage::exception('Mage_Core', 'Error in file: ...')
  • 如何解决这个问题
  • 错误的原因是什么
4

3 回答 3

3

原因 :

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

实际上意味着脚本无法创建外键约束,因为错误实际上是错误的,但是失败的原因实际上很简单,如果您尝试创建两个字段,mysql 将不允许您创建 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_idsmallint(5) unsigned not null

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

  // `attribute_id` smallint UNSIGNED NOT NULL, -- old line
  `attribute_id` smallint(5) UNSIGNED NOT NULL, // new line, so the field have the right type
于 2016-02-02T16:42:18.807 回答
1

请确保在导出原始数据库时将 Check Foreign Key Constraints 设置为 Off。

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

于 2016-02-01T10:35:17.800 回答
1

这可能是数据库引擎的问题。几个月前我也遇到了同样的问题,所以我compared my updated magento database tables engine使用 1.9 数据库表引擎并观察到所有表都有MyISAM作为数据库引擎,所以我像在1.9 数据库中一样对其进行了更改,我的问题得到了解决

于 2016-02-05T11:55:55.680 回答