Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Magento 1.4.0到1.6.2.0升级时的唯一约束冲突_Magento - Fatal编程技术网

Magento 1.4.0到1.6.2.0升级时的唯一约束冲突

Magento 1.4.0到1.6.2.0升级时的唯一约束冲突,magento,Magento,我正在现有的Magento站点上运行升级。大约10分钟后,Magento报告了一个异常,当我检查/var/report中的错误报告文件时,我看到以下错误消息和堆栈转储: a:5:{i:0;s:223:"Error in file: "/var/www/vhosts/mymagesite/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php" - SQLSTATE[23000]: Inte

我正在现有的Magento站点上运行升级。大约10分钟后,Magento报告了一个异常,当我检查/var/report中的错误报告文件时,我看到以下错误消息和堆栈转储:

a:5:{i:0;s:223:"Error in file: "/var/www/vhosts/mymagesite/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php" - SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0-8' for key 'UNQ_BY_CUSTOMER'";i:1;s:952:"#0 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(645): Mage::exception('Mage_Core', 'Error in file: ...')
#1 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(437): Mage_Core_Model_Resource_Setup->_modifyResourceDb('upgrade', '1.4.0.0.7', '1.6.1.0')
#2 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(320): Mage_Core_Model_Resource_Setup->_upgradeResourceDb('1.4.0.0.7', '1.6.1.0')
#3 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/Resource/Setup.php(235): Mage_Core_Model_Resource_Setup->applyUpdates()
#4 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/App.php(412): Mage_Core_Model_Resource_Setup::applyAllUpdates()
#5 /var/www/vhosts/mymagesite/app/code/core/Mage/Core/Model/App.php(338): Mage_Core_Model_App->_initModules()
#6 /var/www/vhosts/mymagesite/app/Mage.php(640): Mage_Core_Model_App->run(Array)
#7 /var/www/vhosts/mymagesite/index.php(80): Mage::run('default', 'store')
#8 {main}";s:3:"url";s:16:"/index.php/admin";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:7:"default";}
互联网上其他地方的一般建议是将
app/etc/config.xml
中的
更改为:

<initStatements>SET NAMES utf8; SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0;</initStatements>
设置名称utf8;设置外键检查=0;设置唯一检查=0;
然而,禁用您的数据库完整性约束系统是一条保证路径,它将导致以后难以支持和解决的问题。这是一种使升级脚本不会因错误而崩溃的黑客行为,它实际上不会以任何方式或形式修复问题


StackOverflow社区能否提供更好的解决方案,或者就为什么在MySQL中禁用完整性检查是一个好主意给出一个很好的解释?

从错误消息中解读这一点相对容易。您有一个重复客户(或多个重复客户)


在phpMyadmin中打开customer_实体表并查找重复项。根据您的客户数量,您可能希望手动完成此操作,重复的测试可能来自您自己的测试fred@test.com“风格电子邮件。在浏览完表格并自己计算出发生了什么之后,您应该能够安全地删除这些内容。

此表格可以截断。

它是收集站点使用信息的大量表格之一,这些信息对magento的运营并不重要。(如果您使用客户报告,它会影响客户报告。)

问题在于来自以下位置的迁移脚本:

/app/code/core/Mage/Customer/sql/customer_setup/mysql4-upgrade-1.5.9.9-1.6.0.0.php
它将一个用于默认为NULL的列更改为默认为notnull

ALTER TABLE `report_compared_product_index` MODIFY COLUMN `customer_id` int UNSIGNED NOT NULL COMMENT ''
错误来自该列上的唯一索引。之前它是空的,所以MySQL忽略了唯一的索引。将其设置为默认值NOTNULL后,null不再是有效值,它会尝试将列的值设置为0。它到达第二行,现在它破坏了唯一索引,你会得到一个错误,

1.4x代码在此表中保存了与新架构不兼容的数据。 它也将很难清理,因为您缺少的信息需要满足唯一索引。
最快的选择是截断表。

禁用了所有扩展,并在升级时还原为默认主题?我没有禁用扩展或还原为默认主题。我不确定这样做如何解决这个问题。如果第三方扩展导致了此错误,那么“损坏”已经对数据库造成,禁用它们将无法恢复。嘿,吉姆:)您应该禁用它们的原因是扩展通常的工作方式。如果您需要更改某些内容,并且扩展正在重写某些版本的Magento,而不是将其更新为最新版本,则Magento的方法是进行扩展和重写。所以基本上错误在于扩展重写了一些东西,而magento已经更新了这个部分=conflictahh,ok。。。我现在明白了。我能够通过从命令行(即“php index.php”)运行更新来克服这个问题。如果数据库中确实存在重复记录,无论更新是从浏览器还是从命令行运行,我都会看到相同的错误消息。谢谢@txyoji这是一个很好的答案。